合并两个列表

时间:2010-11-27 15:01:41

标签: java exception

您好 我在像mergesort这样的代码中合并两个列表时遇到了问题 这是我的代码,它会抛出异常,但我不知道为什么!请帮帮我

private void solve(List<Point> upperHull) {
    list = upperHull;
    number = upperHull.size();
    dcHullForUpperHull(0, number-1 );
}

private void dcHullForUpperHull(int low, int high) {
    /*System.out.println(list);*/
    if (low<high) {
        // Get the index of the Object which is in the middle
        int mid = (low + high) / 2;
        // Sort the left side of the list
        dcHullForUpperHull(low, mid);

        // Sort the Right side of the list
        dcHullForUpperHull(mid +1 , high);

        //combine them both.

        mergeForUpperHull(low, mid, high);
    }
}

private void mergeForUpperHull(int low, int mid, int high) {


    List<Point> auxiliaryList = new ArrayList<Point>();
    List<Point> auxiliaryListTow = new ArrayList<Point>();
    for (int i = low; i <= mid; i++) {
    auxiliaryList.add(upperHull.get(i));
    }
    for (int i = mid + 1; i <= high; i++) {
    auxiliaryListTow.add(upperHull.get(i));
    }

    System.out.println(auxiliaryList.get(mid));
    System.out.println(auxiliaryList.get(low));
    }

以下例外情况适用于行:System.out.println(auxiliaryList.get(mid)); 例外:

X :166.0  Y: 104.0angle0.0
X :166.0  Y: 104.0angle0.0
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at ConvexHull.DCHullVersion.mergeForUpperHull(DCHullVersion.java:142)
    at ConvexHull.DCHullVersion.dcHullForUpperHull(DCHullVersion.java:126)
    at ConvexHull.DCHullVersion.dcHullForUpperHull(DCHullVersion.java:122)

3 个答案:

答案 0 :(得分:1)

for (int i = mid + 1; i <= high; i++) {
    auxiliaryListTow.add(upperHull.get(i));
}

我想这是引起异常的行? 尝试将i&lt; = high转换为i&lt;高

它与你的函数无关......问题是你试图访问一个不存在的数组字段。

在Java中,数组以0索引开头。

欢呼声

答案 1 :(得分:0)

如果我没有记错,如果列表大小,让我们说,3个或更多元素,那么

private void mergeForUpperHull(int low, int mid, int high)

方法将在某些时候被调用,参数 都具有相同的值,高于0 即可。这肯定会导致您尝试执行此操作时遇到的异常 System.out.println(auxiliaryList.get(mid));
尝试逐行调试代码,它可能对您有所帮助 我只是好奇,你为什么要这样做?您的代码摘录留下了很多猜测,说实话,它没有多大意义(至少对我而言)。

答案 2 :(得分:0)

您获得IndexOutOfBoundsException的原因是每次调用mergeForUpperHull时都要创建一个全新的List<Point> auxiliaryList。因此,在low = mid = 2的情况下,您将在新的auxiliaryList中插入(添加)一个元素,这与您尝试从系统中的auxiliaryList获取的mid索引不对应。

代码还有其他问题,但我会假设您只是处于便笺簿模式。但是为了给你一些有效的指导,我不会在合并方法中使用两个辅助列表,而是使用主列表来执行比较和交换操作。请记住,如果您只是为每个合并操作添加一个辅助列表,那么由于从递归的dcHullForUpperHull调用中冒出来,您将在最终列表中拥有更多数据。

更准确地说,您最终会从正在执行的合并中获得(Log2(size of list)+1)*(size of list)个元素(假设您不是每次都创建一个全新的列表)

划分和征服算法是很好的学习练习,所以我不会在这里吐出完整的代码,但上面应该是你完成上述合并排序的好方向