所以我正在编写一个算法来找到一个问题的所有解决方案,每次我找到一个更好的解决方案时,我都会用我的解决方案对象中的解决方案覆盖当前列表,每次我找到一个相同的解决方案时,我都想将它添加到我的解决方案列表。
问题是,在我的输出中,我得到了 6 次相同的解决方案,我想这是因为我正在复制引用而不是添加原始解决方案。
我发现了一个看起来像我的问题的帖子(Java 中 ArrayList 的问题),但我尝试了他们在那里所做的事情,但它并没有解决我的问题。
所以我尝试了不同的东西,这是我想出的最好的。这是我调用的将当前解决方案与当前解决方案对象中的解决方案一起添加到列表的方法。这有点长,我做了一些不必要的事情,我只是想解决我的问题。
ArrayList<Integer> horstreets;
ArrayList<Integer> verstreets;
public ArrayList<StreetPlan> addCurrentPlan(Solutions sol) {
ArrayList<StreetPlan> plan = new ArrayList<>();
ArrayList<Integer> h = null;
ArrayList<Integer> v = null;
//copy all the previous answers
for (StreetPlan a : sol.getStreetPlans()) {
h= new ArrayList<>();
for (Integer b : a.getHorizontalStreets()) {
Integer c=b.intValue();
h.add(c);
}
v = new ArrayList<>();
for (Integer b : a.getVerticalStreets()) {
Integer c=b.intValue();
v.add(c);
}
plan.add(new MyStreetPlan(h, v));
}
//add new solution
h= new ArrayList<>();
v= new ArrayList<>();
for (Integer b : horstreets) {
int c= b.intValue();
h.add(c);
}
for (Integer b : verstreets) {
int c= b.intValue();
v.add(c);
}
plan.add(new MyStreetPlan(h, v));
return plan;
}
这就是我调用新 StreetPlan 并仅添加当前(因此更好)解决方案的方法。
public ArrayList<StreetPlan> setBetterPlan() {
ArrayList<StreetPlan> plan = new ArrayList<>();
ArrayList<Integer> h = null;
ArrayList<Integer> v = null;
h= new ArrayList<>();
v= new ArrayList<>();
for (Integer b : horstreets) {
int c= b.intValue();
h.add(c);
}
for (Integer b : verstreets) {
int c= b.intValue();
v.add(c);
}
plan.add(new MyStreetPlan(h, v));
return plan;
}
对不起,如果我把帖子写得有点长,我只是想让它清楚。对不起我的英语:p
编辑 我知道这种方法有很多代码,但如果我这样做
ArrayList<StreetPlan> plan = new ArrayList<>();
plan.add(new MyStreetPlan(horstreets,verstreets));
sol = new MySolutions(Bcost, Hstreets, plan);
添加更好的解决方案,并添加一个平等的计划:
ArrayList<StreetPlan> plan = new ArrayList<>();
plan.add(new MyStreetPlan(horstreets,verstreets));
plan.addAll(sol.getStreetPlans());
sol = new MySolutions(Bcost, Hstreets, plan);
我的输出只是一些白线(因为在我的算法末尾horstreets
并且verstreets
只是两个空列表)