我尝试用max min方法创建一个Nim游戏。这就是我创建的用于构建树的代码。为什么此列表只能存储最后一个元素?请帮助
list.add(array);
这是我的课程
class Node {
public static int jml = 0;
public List<int[]> list; //only one list is needed (to insure)
Node n; //not needed also (can be removed)
public void mulai(int[] arg, String tipe){
int sisa, index = 0, o = 0;
boolean cek=false;
int array[] = new int[arg.length+1];
list=new ArrayList<int[]>();
n=new Node();
int[] arrayCloned = null;
for(int nilai : arg)
{ //Looping untuk tiap nilai pada array
for(int i = 1; i<nilai/2+1;i++)
{ //Looping untuk pengurangan
sisa = nilai - i;
if(sisa!=i){
for(int n = 0; n<array.length ;n++)
{ //Looping untuk membuat turunan
try{
if(n == index){
array[n]=sisa;
array[n+1]=i;
n++;
cek=true;
}else{
if(cek)
array[n]=arg[n-1];
else
array[n]=arg[n];
}
}catch(ArrayIndexOutOfBoundsException e){
}
} //Akhir looping turunan
System.out.printf("i = %d\n",i);
System.out.println("Befor add");
printListOfArray();
list.add(array); /*This code can only store the last element*/
System.out.println("After add");
printListOfArray();
System.out.println("======================");
if(tipe.equals("min"))
n.mulai(array, "max");
else
n.mulai(array, "min");
}
} //Akrir looping pengurangan
index++;
} //Akhir looping nilai array
}
void printListOfArray(){
for(int[] ins:list){
System.out.print("Elements: ");
for(int i:ins)
System.out.print(" "+i);
System.out.println();
}
}
public void print(){
for(int[] nilai : n.list){
System.out.println(Arrays.toString(nilai));
}
}
}
我在这里遇到麻烦
list.add(array);
请帮助。我不知道我的代码有什么问题 这是我的输出
i = 1 Befor添加 添加后 元素: 4 1
i = 1 Befor添加 添加后 元素:3 1 1
i = 1 Befor添加 添加后 元素:2 1 1 1
i = 2 Befor添加 元素: 3 2
添加后 要素:3 2 元素:3 2
i = 1 Befor添加 添加后 元素:2 1 2
我不知道为什么这是不断变化的原因。 i = 1保存4 1,当i = 2时更改为3 2
答案 0 :(得分:0)
解决了您的问题:在递归中,您正在创建新列表和新类Node(实例),这导致您的结果是最后一个,因为其他人不在了。另请参见代码中的注释和一些文档。例如使用this。 (我还添加了一种打印答案的方法...。)
class Node {
public static int jml = 0;
List<int[]> list=new ArrayList<int[]>(); //only one list is needed (to insure)
int array[]=null;
Node n; //not needed also (can be removed)
public void mulai(int[] arg, String tipe){
int sisa, index = 0, o = 0;
boolean cek=false;
array = new int[arg.length+1];
// list=new ArrayList<int[]>();
// n=new Node();
for(int nilai : arg)
{ //Looping untuk tiap nilai pada array
for(int i = 1; i<nilai/2+1;i++)
{ //Looping untuk pengurangan
sisa = nilai - i;
if(sisa!=i){
for(int n = 0; n<array.length ;n++)
{ //Looping untuk membuat turunan
try{
if(n == index){
array[n]=sisa;
array[n+1]=i;
n++;
cek=true;
}else{
if(cek)
array[n]=arg[n-1];
else
array[n]=arg[n];
}
}catch(ArrayIndexOutOfBoundsException e){
}
} //Akhir looping turunan
//System.out.println("Befor add");
//printListOfArray();
list.add(array); /*This code can only store the last element*/
//System.out.println("After add");
//printListOfArray();
//System.out.println("======================");
if(tipe.equals("min"))
this.mulai(array, "max"); //and not n.mulai(...)
else
this.mulai(array, "min"); //and not n.mulai(...)
}
} //Akrir looping pengurangan
index++;
} //Akhir looping nilai array
}
void printListOfArray(){
for(int[] ins:list){
System.out.print("Elements: ");
for(int i:ins)
System.out.print(" "+i);
System.out.println();
}
}
printListOfArray();
}
答案 1 :(得分:0)
让我将您的代码简化为与您的问题相关的要点:
class Node {
public List<int[]> list;
public void mulai(int[] arg, String tipe){
int array[] = new int[arg.length + 1];
list = new ArrayList<int[]>();
for(...) {
for(...) {
if(...){
for(...) {
// assign stuff to elements of 'array'
}
list.add(array);
}
}
}
}
}
问题是此代码中只有一个int[]
对象。使用以下行创建对象:
int array[] = new int[arg.length + 1];
然后一次又一次地重复使用该对象。
因此,当您这样做时:
list.add(array);
您实际上是一次次地将相同的数组(引用!)添加到列表中。
在“为“数组”的元素分配内容”的代码中(请参见上面的代码中的注释),实际上,您只是在更改已经添加到列表中的数组。
解决方案:您需要使用new
(或等效方法)来创建一个新数组,并在最内层循环之前将其分配为array
。或者...只需将array
的声明和初始化移动到最内层循环之前即可。
(您似乎已经暗示需要这样做:
int[] arrayCloned = null;
,但您实际上并未使用此声明。再看一下代码,我不认为复制或克隆数组是最好的方法...)