Java循环缺少给定数组中的元素

时间:2015-11-10 14:03:12

标签: java for-loop arraylist

我有一个简单的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;
}

2 个答案:

答案 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);