迭代ArrayList时并发修改异常

迭代ArrayList时并发修改异常

本文介绍了迭代ArrayList时并发修改异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

The sort method results in a concurrent modification error when i use temp = iterator.next(). Can you please help me resolve the concurrent modification error.I gave the code for the entire class but I'm only trying complete the sort method. Thanks in advance for your help.

我必须对数组列表中的所有数组进行排序.

I have to sort all the the arrays in the 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();
            }
        }

推荐答案

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

It looks like your problem is that you're creating an iterator for a list, then modifying the list (adding + sorting), then attempting to use the iterator.

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

If you instead created the iterator after this, it should work.

例如.

            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));
                }

这篇关于迭代ArrayList时并发修改异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 21:30