我试图自己学习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 ==降序。我可以担心。任何类型的帮助将不胜感激。
答案 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);
}
}