我是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;
}
}
答案 0 :(得分:0)
请注意,在Java中,有一个名为ArrayList的实际对象。使用它可以简化你想要做的事情,或者至少使它更容易阅读,因为该类的方法将使你的代码像动词一样阅读。
值是相同的,因为您在新的State对象中存储了相同的数组。考虑Array utilities中的一种复制方法。稍后在代码中再次覆盖该值,但由于它与存储的数组对象相同,所以它们看起来都是一样的。
关于您的代码,了解更多您正在尝试的内容会很有帮助。也许可以看到更多周围的代码。然而,有些事情引起了我的注意:
numberOfCase
是一个字符串,令人困惑,因为人们可能认为应该是一个数字。
switch
,但请考虑输入Enum
s。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...
}