我正在尝试编写自己的MergeSort版本并编写了以下类:
import java.util.List;
import java.util.LinkedList;
import java.lang.Comparable;
public class Sort<E extends Comparable<E>> {
private List<E> list;
public void setList(List<E> inList) {list = inList;}
public List<E> getList() {return list;}
public List<E> mergeSortRec(List<E> inList) {
if (inList == null) return null;
if (inList.size() < 2) return inList;
int mdpt = inList.size()/2;
List<E> left = inList.subList(0,mdpt);
List<E> right = inList.subList(mdpt,inList.size());
left = mergeSortRec(left);
right = mergeSortRec(right);
List<E> out = new LinkedList<E>();
while (left.size()>0 && right.size()>0) {
if (left.get(0).compareTo(right.get(0)) < 0) {
out.add(left.remove(0));
} else {
out.add(right.remove(0));
}
}
if (left.size()==0) {
while (right.size()>0) {
out.add(right.remove(0));
}
} else {
while (left.size()>0) {
out.add(left.remove(0));
}
}
return out;
}
public void mergeSort() {list = mergeSortRec(list);}
}
但是,下面的主要类
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
System.out.println("Input list:");
LinkedList<Integer> lst = new LinkedList<Integer>();
lst.add(3);
lst.add(1);
lst.add(5);
Sort<Integer> s = new Sort<Integer>();
s.setList(lst);
s.mergeSort();
}
}
导致以下错误,
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.SubList.checkForComodification(AbstractList.java:769)
at java.util.SubList.size(AbstractList.java:645)
at Sort.mergeSortRec(Sort.java:69)
at Sort.mergeSortRec(Sort.java:59)
at Sort.mergeSort(Sort.java:79)
at Main.main(Main.java:12)
在插入打印行之后,我发现问题出在left.size()
中对if (left.size()==0) {
的调用上,我认为这是在递归调用的“零级”中发生的,则是当inList
是整个原始列表,并且left
是3且right
是1,5时发生。我不明白为什么对left
的方法调用会导致错误。我只是模糊地了解如何存在一些并发问题,但是我对此几乎没有经验,我认为left
是函数的返回值,因此不应该这样做。不能被多个变量引用-如果这与问题有关。
答案 0 :(得分:2)
这里的问题是由于从列表中删除了要迭代的项:
while (left.size()>0 && right.size()>0) { // iteration on left/right lists
if (left.get(0).compareTo(right.get(0)) < 0) {
out.add(left.remove(0)); // modification of the left list
} else {
out.add(right.remove(0)); // modification of the right list
}
}
在while迭代中删除项目会违反列表对象的协定,并导致您的异常-ConcurrentModificationException。
有多种方法可以解决此问题-
remove()
方法。参考文献: