为什么此list <int []>不保留第一个元素?

时间:2019-04-13 05:51:34

标签: java

我尝试用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

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;

,但您实际上并未使用此声明。再看一下代码,我不认为复制或克隆数组是最好的方法...)