无法合并两个arraylists

时间:2012-03-21 01:11:52

标签: java

我试图自己学习java,书中的一个问题就是把我交给我。它是在将MergeSort样式排序后合并两个ArrayList。在没有重大灾难的情况下,我无法将它们合并在一起。我真的很想知道它,所以我可以继续前进,这让我疯狂。

 public <E extends Comparable<?super E>> void merge(List<E> front, List<E> back, boolean last, List<E> result){
  int i = 0;
  int j = 1;
    while (!front.isEmpty() && !back.isEmpty()) {
      if (front.get(0).compareTo(back.get(0)) <= 0) {
            result.add(result.size() -1, front.remove(0));
            System.out.println("works" + result);
          } else {
            result.add(result.size() -1, back.remove(0));
            System.out.println("no work" + result);
          }
    }
     while (!front.isEmpty()) {
        result.add(result.size() -1,front.remove(0));
    }
    while (!back.isEmpty()) {
        result.add(result.size() - 1, back.remove(0));
    }
System.out.println();
} } 

布尔值是对它们进行排序:true ==升序,false ==降序。我可以担心。任何类型的帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

我认为您所要做的就是进行以下更改

result.add(front.remove(0));

和else子句中的相同更改。

要在结果列表的末尾添加元素,不应指定索引。

答案 1 :(得分:0)

如果您的arraylists已排序,请循环遍历它们,并在一端采用最小元素(假设您需要升序)。执行此操作直到其中一个列表为空。然后只需将剩余列表中的条目附加到合并列表中。

答案 2 :(得分:0)

嗯,我用来实现合并的一种安全方法如下所示。

public <E extends Comparable<? super E>> void merge(List<E> front,
            List<E> back, boolean last, List<E> result) {
        int i = 0;
        int j = 0;
        Collections.sort(front);
        Collections.sort(back);
        while (!(i == front.size() && j == back.size())) {
            E e;
            if (i == front.size()) {
                // If we have exhausted the 'front' then copy whatever is in
                // 'back'
                e = back.get(j);
                // Move back index to next
                j++;
            } else if (j == back.size()) {
                // If we have exhausted the 'back' then copy whatever is in
                // 'front'
                e = front.get(i);
                // Move front index to next
                i++;
            } else {
                if ((front.get(i).compareTo(back.get(j)) <= 0)) {
                    // front item will be added, increment front index for next
                    e = front.get(i);
                    i++;
                } else {
                    // back item will be added, increment back index for next
                    e = back.get(j);
                    j++;
                }
            }
            result.add(e);
        }
        if(last){
            Collections.reverse(result);
        }
    }