数组列表.get()无法正常工作

时间:2015-06-03 01:29:56

标签: java algorithm

我正在实施一个贪婪的算法来解决背包问题,我一直在讨论这个我无法弄清楚的问题。

public void greedySort() {
   int curW = 0;
   Collections.sort(sorted);
   for(int i = 0; i < sorted.size(); i++) {
      Entry temp = sorted.get(i);
      System.out.println("Index: " + temp.index + "Ratio: " + temp.ratio);
   }
   System.out.println("Sorted size: "+sorted.size());
   while(sorted.size() > 0 && curW < maxW) {
      Entry temp = sorted.get(0);
      if(curW + temp.weight <= maxW) {
         ret.add(temp);
         curW += temp.weight;
      }
      sorted.remove(0);
   }
}

当我运行

Entry temp = sorted.get(0);

我得到一个IndexOutOfBoundsException,即使Collections.sort(已排序)之后的for循环将正确迭代“已排序”并以正确的顺序打印出所有值。我究竟做错了什么?另外,如果您在此代码中看到我的算法设计有任何错误,请告诉我这些。

编辑:添加了Sorted.size println。它应该打印20。 Sorted是背包条目的ArrayList,按其值/重量比排序。 Sorted不为空,这是通过它运行20值输入文件后的输出

Index: 14 Ratio: 14.0
Index: 0 Ratio: 3.1379310344827585
Index: 15 Ratio: 2.7
Index: 4 Ratio: 1.7555555555555555
Index: 17 Ratio: 1.72
Index: 19 Ratio: 1.4210526315789473
Index: 8 Ratio: 1.3333333333333333
Index: 18 Ratio: 1.2195121951219512
Index: 11 Ratio: 1.2
Index: 1 Ratio: 0.9230769230769231
Index: 9 Ratio: 0.9230769230769231
Index: 6 Ratio: 0.8636363636363636
Index: 2 Ratio: 0.8591549295774648
Index: 12 Ratio: 0.6530612244897959
Index: 5 Ratio: 0.647887323943662
Index: 16 Ratio: 0.6111111111111112
Index: 7 Ratio: 0.5876288659793815
Index: 10 Ratio: 0.3508771929824561
Index: 13 Ratio: 0.34831460674157305
Index: 3 Ratio: 0.15
Sorted size: 20
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

此处使用驱动程序为函数指定的值创建Sorted

public void Greedy(int[] val, int[] weight, int maxVal) {
  final long startTime = System.currentTimeMillis();
  GreedyAlgorithm alg = new GreedyAlgorithm();
  alg.sorted = new ArrayList<Entry>();
  alg.ret = new ArrayList<Entry>();
  alg.maxW = maxVal;
  for(int i = 0; i < val.length; i++) {
     Entry newE = new Entry();
     newE.index = i;
     newE.value = val[i];
     newE.weight = weight[i];
     newE.ratio = ((double)newE.value)/((double)newE.weight);
     alg.sorted.add(newE);
  }
  alg.greedySort();
  final long endTime = System.currentTimeMillis();
  System.out.println("Total execution time: " + (endTime - startTime) );
}

2 个答案:

答案 0 :(得分:0)

正如之前的评论者指出的那样,你继续删除ArrayList中的第一个元素。当你遍历所有20个元素时,你已经删除了ArrayList中的所有内容。

因此,请确保在列表为空时结束循环。将您的while条件更改为:

while(sorted.size() > 0 && curW < maxW) {
    // Put this print line inside the loop to debug.
    System.out.println("Sorted size: "+sorted.size());
    Entry temp = sorted.get(0);
    if(curW + temp.weight <= maxW) {
        ret.add(temp);
        curW += temp.weight;
    }
    sorted.remove(0);
}

答案 1 :(得分:0)

显然我的IDE造成了某种问题,最近有点不稳定。重新启动后,我打开文件并运行它们,错误消失了。

感谢Thilo和hungryghost,在重启任何一种方式后,while循环问题都会出现。