2012-12-07 3 views
0

Метод сортировки приводит к ошибке одновременной модификации, когда я использую temp = iterator.next(). Не могли бы вы помочь мне решить проблему одновременной модификации. Я дал код для всего класса, но я только пытаюсь завершить метод сортировки. Заранее спасибо за вашу помощь.Параллельная модификация Исключение при повторении через ArrayList

Мне нужно отсортировать все массивы в 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<PhoneBookEntry>[] 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<PhoneBookEntry>(); 
      } 

      public int getSize() { 
       int tot = 0; 
       for (ArrayList<PhoneBookEntry> 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<PhoneBookEntry> x : buckets) 
        if (x.size() > numb) 
         numb = x.size(); 
       return numb; 
      } 

      public void display() { 
       for (ArrayList<PhoneBookEntry> x : buckets) 
        System.out.println(x); 
      } 

      public int getNumberOfNulls() { 
       int numb = 0; 
       for (ArrayList<PhoneBookEntry> x : buckets) 
        if (x.size() == 0) 
         numb++; 
       return numb; 
      } 

      public String lookup(String name) { 
       String numb = name + "'s number not found"; 
       for (ArrayList<PhoneBookEntry> 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<PhoneBookEntry> 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<String> list = new ArrayList<String>(); 
       ListIterator<String> iterator = list.listIterator(); 
       final ArrayList<PhoneBookEntry>[] data = buckets.clone(); 
       for (ArrayList<PhoneBookEntry> 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(); 
      } 
     } 

ответ

1

Это выглядит как ваша проблема в том, что вы создаете итератор для списка, а затем изменения списка (добавление + сортировки), а затем пытается использовать итератор.

Если вы вместо этого создали итератор после этого, он должен работать.

например.

  for (ArrayList<PhoneBookEntry> x : buckets) { 
       for (int i = 0; i < x.size(); i++) { 
        list.add(x.get(i).getN()); 
       } 
       Collections.sort(list); 
       ListIterator<String> 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)); 
       } 
0

Исправлена ​​ошибка в том, что вы перебрать список в то время как вы добавляете к нему. вы не должны этого делать.

0

Вот javadoc для ConcurrentModificationException.

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

если поток изменяет коллекцию непосредственно в то время как итерация по коллекции с отказоустойчивостью быстрым итератором, итератор выбросит это исключение.

Как и другие плакаты, вы должны выполнить всю сортировку и добавление до или после использования вашего итератора. Вы можете удалить элемент во время итерации, но вы должны использовать Iterator.remove(), чтобы предотвратить повторное получение такого же исключения.

Смежные вопросы