我有一个简单的for
循环遍历ArrayList
个对象。每次检查添加当前对象时是否会增加列表x的总容量。如果未达到或超过capaticy,则将对象添加到列表x,否则,将列表x添加到x的另一个列表y,清除列表x,然后添加当前对象。
List<Customer> route = new ArrayList<Customer>();
for(Polar s:polars) {
if((requirment(route) + s.getCustomer().c) <= prob.depot.c) {
route.add(s.getCustomer());
} else {
soln.add(route);
route.clear();
route.add(s.getCustomer());
}
}
现在我打印了对象列表,以便验证它的顺序是否正确,但是执行此循环只输出一个列表,并且似乎错过了对象列表中的前几个项目。这是一个简单的循环,但我不能为我的生活找出问题所在。
感谢任何帮助!
完成此处的是requirment()
:
public int requirment(List<Customer> route) {
int r = 0;
if(route.isEmpty() == true) return 0;
for(Customer cust : route) {
r = r + cust.c;
}
return r;
}
答案 0 :(得分:0)
我想这是soln的定义:
List<List<Customer>> soln = new ArrayList<List<Customer>>();
在Java中,非原始类型将数据存储在内存中,变量引用它们。因此,列表中的每个项目都会引用内存中的某个路径。
当你这样做时
soln.add(route);
route.clear();
将某些路径的引用添加到soln中,然后在soln中存储的同一实体上调用clear方法。最后一个列表没有被删除,因为for循环在调用clear方法之前结束。
这就是你解决这个问题的方法:
soln.add(route);
route = new ArrayList<Customer>();
这意味着路径的引用保存在soln中,然后保存在第二行,到存储新实例的变量路径(在您想要存储的路径上不调用clear方法)
答案 1 :(得分:-1)
如果soln是List<Customer>
对象,那么您只想复制到路由内容。只需使用
soln.addAll(route);
而不是
soln.add(route);