繁体   English   中英

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

[英]Java loop missing elements in given array

我有一个简单的for循环,它遍历对象的ArrayList 每次它检查添加当前对象是否会增加列表 x 的总数超过容量。 如果未达到或超过容量,则将对象添加到列表 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;
}

我想这是 soln 的定义:

List<List<Customer>> soln = new ArrayList<List<Customer>>();

在 Java 中,非原始类型将数据存储在内存中,变量引用它们。 因此,列表中的每一项都引用了内存中某处的一条路线。

当你这样做时

        soln.add(route);
        route.clear();

您将某个路由的引用添加到 soln 中,然后在存储在 soln 中的同一实体上调用 clear 方法。 最后一个列表不会被擦除,因为 for-cycle 在调用 clear 方法之前结束。


这是你解决这个问题的方法:

        soln.add(route);
        route = new ArrayList<Customer>();

这意味着路由的引用保存在 soln 中,然后在第二行中,存储新实例的变量路由(它不会在要存储的路由上调用 clear 方法)

如果 soln 是List<Customer>对象,那么您只想复制到路由的内容。 只需使用

soln.addAll(route);

代替

soln.add(route);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM