【问题标题】:Java loop missing elements in given arrayJava循环在给定数组中缺少元素
【发布时间】:2015-11-10 14:03:12
【问题描述】:

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

【问题讨论】:

  • 我认为调试器是你唯一的希望
  • 这段代码不能编译它的isEmpty() 有专利权

标签: java for-loop arraylist


【解决方案1】:

我想这是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方法)

【讨论】:

  • 这似乎对丢失第一个对象的问题进行了排序,但不仅输出第一个列表......一旦达到容量,就不会将其他列表添加到 soln
  • @JackMoulson - 只需替换该代码并观看奇迹 :)。
  • 我将route.clear() 更改为route = new ArrayList&lt;Customer&gt;(); soln 只包含一个列表,还是我误会了你:P
  • @JackMoulson - 这意味着只有一次超出了您的限制,或者甚至没有使用您拥有的数据触发它。我不知道您的数据和其余代码,但我向您展示的内容确实不正确。
  • 是的,我刚刚意识到最后一个对象不超过容量!感谢您的帮助!
【解决方案2】:

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

soln.addAll(route);

而不是

soln.add(route);

【讨论】:

  • 抱歉,如果这是真的,这甚至无法编译。
猜你喜欢
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多