I am trying to implement merge sort in java, but this causes a ConcurrentModificationException in the line while(ai<la.size()&&bi<lb.size()){
. I have seen a lot of answers on Stack about this but they all relate to removing items from a list, but I am not doing that. What is causing this exception, and how can I fix this?
public static <Elem extends Comparable<Elem>> void mergesort(List<Elem> list) {
if(list.size()>1){
int hf = list.size()/2;
List<Elem> la = list.subList(0, hf-1);
List<Elem> lb = list.subList(hf, list.size()-1);
mergesort(la);
mergesort(lb);
int ai=0;
int bi=0;
int oi=0;
while(ai<la.size()&&bi<lb.size()){
if(la.get(ai).compareTo(lb.get(bi))>0){
list.add(oi, la.get(ai));
ai++;
}
else{
list.add(oi, lb.get(bi));
bi++;
}
oi++;
}
while(ai<la.size()){
list.add(oi, la.get(ai));
ai++;
oi++;
}
while(bi<lb.size()){
list.add(oi, lb.get(bi));
bi++;
oi++;
}
}
}
But testing this with as mergesort(Arrays.asList(3, 2, 1, 6, 5, 4))
causes the following error:
java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231)
at java.util.ArrayList$SubList.size(ArrayList.java:1040)
at week04.MergeSort.mergesort(MergeSort.java:17)
at week04.test.MergeSortTest.testMergesortUnsortedList(MergeSortTest.java:42)