在ArrayList中添加项目会使之前的项目与新添加的项目完全相同

时间:2013-12-04 13:02:09

标签: java arraylist

我是java中的菜鸟,我似乎无法弄清楚每次向ArrayList添加新项目时,以前的项目都会与新项目完全相同。我做了我从这里的帖子中学到的所有相同问题,但我仍然无法弄清楚究竟是什么问题。我已经在这一个星期了。希望有人会帮忙。

这是我的代码:

private void generation(String numberOfCase,int i, int j){

    switch(numberOfCase){

    case "N":
        int tempN = 0;

        if(i == 1)
            tempN = 0;
        if(i == 2)
            tempN = 1;

        forGenerating[i][j] = current[tempN][j];
        forGenerating[tempN][j] = 0;

        State tempNo = new State(forGenerating,current,1,howFar);
        adding(tempNo);
        //adding(forGenerating,current,1,howFar);

        forGenerating[tempN][j] = forGenerating[i][j];
        forGenerating[i][j] = 0;

        break;
    case "E":
        int tempE = j+1;

        forGenerating[i][j] = current[i][tempE];
        forGenerating[i][tempE] = 0;

        State tempEa = new State(forGenerating,current,1,howFar);
        adding(tempEa);
        //adding(forGenerating,current,1,howFar);

        forGenerating[i][tempE] = forGenerating[i][j];
        forGenerating[i][j] = 0;

        break;
    case "S":
        int tempS = 0;

        if(i == 0)
            tempS = 1;
        if(i == 1)
            tempS = 2;

        forGenerating[i][j] = current[tempS][j];
        forGenerating[tempS][j] = 0;

        State tempSo = new State(forGenerating,current,1,howFar);
        adding(tempSo);
        //adding(forGenerating,current,1,howFar);

        forGenerating[tempS][j] = forGenerating[i][j];
        forGenerating[i][j] = 0;

        break;
    case "W":
        int tempW = j-1;

        forGenerating[i][j] = current[i][tempW];
        forGenerating[i][tempW] = 0;

        State tempWe = new State(forGenerating,current,1,howFar);
        adding(tempWe);
        //adding(forGenerating,current,1,howFar);

        forGenerating[i][tempW] = forGenerating[i][j];
        forGenerating[i][j] = 0;

        break;
    }

}

private void adding(State temp){

    State t = new State(temp);

    if(closedList.equals(temp) == false){

        forChecking.add(t);
        iterator+=1;

    }

}

我创建了一个我为状态创建的类的ArrayList。

EDIT。这是阶级国家。有两个构造函数,因为我已经编辑了这个代码一个星期了,并且做了我从网上读过的所有可能的解决方案。

import java.util.Arrays; import java.util.Random;

公共类州{

int[][] arr = new int[3][3];
int[][] parent = new int[3][3];
int g=0,f=0,h=0;

public State(int[][] arr, int[][] parent, int g, int h){

    this.arr = Arrays.copyOf(arr, arr.length);
    this.parent = Arrays.copyOf(parent, parent.length);
    this.g = g;
    this.h = h;
    solveF();

}

public State(State temp){

    this.arr = Arrays.copyOf(temp.arr, temp.arr.length);
    this.parent = Arrays.copyOf(temp.parent, temp.parent.length);
    this.g = temp.g;
    this.h = temp.h;
    solveF();

}

private void solveF(){

    f = g+h;

}

}

1 个答案:

答案 0 :(得分:0)

请注意,在Java中,有一个名为ArrayList的实际对象。使用它可以简化你想要做的事情,或者至少使它更容易阅读,因为该类的方法将使你的代码像动词一样阅读。

值是相同的,因为您在新的State对象中存储了相同的数组。考虑Array utilities中的一种复制方法。稍后在代码中再次覆盖该值,但由于它与存储的数组对象相同,所以它们看起来都是一样的。

关于您的代码,了解更多您正在尝试的内容会很有帮助。也许可以看到更多周围的代码。然而,有些事情引起了我的注意:

  • 输入变量numberOfCase是一个字符串,令人困惑,因为人们可能认为应该是一个数字。
    • 虽然字符串上可以switch,但请考虑输入Enums
  • 在adds()方法中,代码closedList.equals(temp)正在比较对象。 “closedList”听起来像一个列表或数组,而“temp”是State,所以它们永远不会相等。也许你打算用!closedList.contains(temp)? (但要注意,您需要在State类中覆盖.equals(Object o)
  • 看起来您的代码假设一个2x2的值矩阵,并且i或j将始终为1或2,对应于N,S,E,W字符串。对于那种类型的情况,我建议使用直接的方法名称创建自己的类。也许是这样的事情:

    public class CompassGenerator{
      //private fields
    
      //returns previous Compass object, if required...
      public Compass generateNorth(int howFar){...}
    
      //Alternatively, pass in Compass object from which to generate
      public Compass generateSouth(Compass prev, int howFar){...}
    
      //etc...
    
    }