迭代修改exception同时迭代ArrayList

当我使用temp = iterator.next()时,sort方法会导致并发修改错误。 你能帮我解决并发修改错误吗? 我给了整个类的代码,但我只是尝试完成排序方法。 在此先感谢您的帮助。

我必须对arraylist中的所有数组进行排序。

package HashSet; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.ListIterator; import java.util.Scanner; public class PhoneBook { int capacity = 10; private ArrayList[] buckets; public PhoneBook() { this(10); load(); } public PhoneBook(int size) { capacity = size; buckets = new ArrayList[size]; for (int i = 0; i < buckets.length; i++) buckets[i] = new ArrayList(); } public int getSize() { int tot = 0; for (ArrayList x : buckets) tot += x.size(); return tot; } public boolean add(PhoneBookEntry entry) { if (contains(entry)) return false; int x = Math.abs(entry.hashCode()); buckets[x % buckets.length].add(entry); return true; } public void load() { InputStream is = getClass().getClassLoader().getResourceAsStream( "phone.txt"); Scanner scan = new Scanner(is); while (scan.hasNext()) add(new PhoneBookEntry(scan.next(), scan.nextInt())); scan.close(); } public void bucketSize() { for (int i = 0; i < buckets.length; i++) System.out.println(i + " " + buckets[i].size()); } public boolean contains(PhoneBookEntry word) { int x = Math.abs(word.hashCode()); return buckets[x % buckets.length].contains(word); } public int getCapacity() { return capacity; } public int getLongestList() { int numb = 0; for (ArrayList x : buckets) if (x.size() > numb) numb = x.size(); return numb; } public void display() { for (ArrayList x : buckets) System.out.println(x); } public int getNumberOfNulls() { int numb = 0; for (ArrayList x : buckets) if (x.size() == 0) numb++; return numb; } public String lookup(String name) { String numb = name + "'s number not found"; for (ArrayList x : buckets) for (int i = 0; i < x.size(); i++) if (x.get(i).getN().equals(name)) numb = name + "'s" + " number is " + x.get(i).getNr(); return numb; } public int internalLookUp(String name) { int numb = 0; for (ArrayList x : buckets) for (int i = 0; i < x.size(); i++) if (x.get(i).getN().equals(name)) numb = x.get(i).getNr(); return numb; } public void sort() { String temp = ""; ArrayList list = new ArrayList(); ListIterator iterator = list.listIterator(); final ArrayList[] data = buckets.clone(); for (ArrayList x : buckets) { for (int i = 0; i < x.size(); i++) { list.add(x.get(i).getN()); } Collections.sort(list); for (int b = 0; b < x.size(); b++) { temp = iterator.next(); //error line x.get(b).setN(temp); x.get(b).setNr(internalLookUp(temp)); } } } public static void main(String[] args) { PhoneBook phone = new PhoneBook(); phone.display(); System.out.println(); System.out.println("Capacity is " + phone.getCapacity()); System.out.println(); System.out.println("Size is " + phone.getSize()); System.out.println(); System.out.println("Get longest list " + phone.getLongestList()); System.out.println(); System.out.println("Number of Nulls " + phone.getNumberOfNulls()); System.out.println(); System.out.println(phone.lookup("Fish")); phone.sort(); } } 

看起来您的问题是您正在为列表创建迭代器,然后修改列表(添加+排序),然后尝试使用迭代器。

如果您在此之后创建了迭代器,它应该可以工作。

例如。

  for (ArrayList x : buckets) { for (int i = 0; i < x.size(); i++) { list.add(x.get(i).getN()); } Collections.sort(list); ListIterator iterator = list.listIterator(); // Iterator created here for (int b = 0; b < x.size(); b++) { temp = iterator.next(); //error line x.get(b).setN(temp); x.get(b).setNr(internalLookUp(temp)); } 

错误是你在添加它时迭代列表 。 你不应该这样做。

这是ConcurrentModificationException的javadoc。

http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

如果一个线程在使用失败快速迭代器迭代集合时直接修改集合,则迭代器将抛出此exception。

正如其他海报所说,你应该在使用迭代器之前或之后进行所有排序和添加。 您可以在迭代期间删除元素,但必须使用Iterator.remove()来防止再次获得相同的exception。