并发修改异常在遍历的ArrayList [英] Concurrent modification Exception while iterating over ArrayList

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

问题描述

在并发修改错误的排序方法,结果当我使用TEMP = iterator.next()。你可以帮我解决并发修改错误。
我给了code为整个类,但我只是想完成排序方法。在此先感谢您的帮助。

我要所有的ArrayList中的数组进行排序。

 包HashSet的;            进口的java.io.InputStream;
            进口的java.util.ArrayList;
            进口java.util.Collections中;
            进口java.util.ListIterator中;
        进口java.util.Scanner中;        公共类电话簿{
            INT容量= 10;
            私人的ArrayList< PhoneBookEntry> []桶;            公用电话簿(){
                这(10);
                加载();
            }            公用电话簿(INT大小){
                容量=大小;
                水桶=新的ArrayList【尺寸】;
                的for(int i = 0; I< buckets.length;我++)
                    桶[I] =新的ArrayList< PhoneBookEntry>();
            }            公众诠释的getSize(){
                INT TOT = 0;
                对于(ArrayList的< PhoneBookEntry> X:桶)
                    TOT + = x.size();
                返回TOT;
            }            公共布尔加(PhoneBookEntry进入){
                如果(包含(入门))
                    返回false;
                INT X = Math.abs(entry.hash code());
                水桶[X%buckets.length]。新增(输入);
                返回true;
            }            公共无效负载(){
                InputStream为=的getClass()。getClassLoader()。的getResourceAsStream(
                        phone.txt);
                扫描程序扫描=新的扫描仪(是);
                而(scan.hasNext())
                    添加(新PhoneBookEntry(scan.next(),scan.nextInt()));
                scan.close();
            }            公共无效bucketSize(){
                的for(int i = 0; I< buckets.length;我++)
                    的System.out.println(ⅰ++水桶[I] .size());
            }            公共布尔包含(PhoneBookEntry字){
                INT X = Math.abs(word.hash code());
                返回水桶[X%buckets.length]。载有(字);
            }            公众诠释getCapacity(){
                返回能力;
            }            公众诠释getLongestList(){
                INT麻木= 0;
                对于(ArrayList的< PhoneBookEntry> X:桶)
                    如果(x.size()>麻木)
                        麻木= x.size();
                返回麻木;
            }            公共无效显示(){
                对于(ArrayList的< PhoneBookEntry> X:桶)
                    的System.out.println(X);
            }            公众诠释getNumberOfNulls(){
                INT麻木= 0;
                对于(ArrayList的< PhoneBookEntry> X:桶)
                    如果(x.size()== 0)
                        麻木++;
                返回麻木;
            }            公共字符串查找(字符串名称){
                字符串麻木=名称+的数量未找到;
                对于(ArrayList的< PhoneBookEntry> X:桶)
                    的for(int i = 0; I< x.size();我++)
                        如果(x.get(ⅰ).getN()。等于(名))
                            麻木=名称+的+号是+ x.get(I).getNr();
                返回麻木;
            }            公众诠释internalLookUp(字符串名称){
                INT麻木= 0;
                对于(ArrayList的< PhoneBookEntry> X:桶)
                    的for(int i = 0; I< x.size();我++)
                        如果(x.get(ⅰ).getN()。等于(名))
                            麻木= x.get(I).getNr();
                返回麻木;
            }            公共无效的sort(){
                字符串TEMP =;
                ArrayList的<串GT;名单=新的ArrayList<串GT;();
                &的ListIterator LT;弦乐>迭代= list.listIterator();
                最终的ArrayList< PhoneBookEntry> []数据= buckets.clone();
                对于(ArrayList的< PhoneBookEntry> X:桶){
                    的for(int i = 0; I< x.size();我++){
                        list.add(x.get(ⅰ).getN());
                    }
                    Collections.sort(名单);
                    对于(INT B = 0; B< x.size(); B ++){
                        TEMP = iterator.next(); //错误行
                        x.get(二).setN(临时);
                        x.get(二).setNr(internalLookUp(临时));
                    }
                }
            }            公共静态无效的主要(字串[] args){
                电话簿手机=新的电话簿();
                phone.display();
                的System.out.println();
                的System.out.println(容量为+ phone.getCapacity());
                的System.out.println();
                的System.out.println(大小+ phone.getSize());
                的System.out.println();
                的System.out.println(获取最长的名单+ phone.getLongestList());
                的System.out.println();
                的System.out.println(空值的数量+ phone.getNumberOfNulls());
                的System.out.println();
                的System.out.println(phone.lookup(鱼));
                phone.sort();
            }
        }


解决方案

它看起来像你的问题是,你创建一个迭代器列表,然后修改列表(添加+排序),然后尝试使用迭代器。

如果您不是在这之后创建的迭代器,它应该工作。

如。

 为(ArrayList的< PhoneBookEntry> X:桶){
                的for(int i = 0; I< x.size();我++){
                    list.add(x.get(ⅰ).getN());
                }
                Collections.sort(名单);
                &的ListIterator LT;弦乐>迭代= list.listIterator(); //创建的Iterator这里
                对于(INT B = 0; B< x.size(); B ++){
                    TEMP = iterator.next(); //错误行
                    x.get(二).setN(临时);
                    x.get(二).setNr(internalLookUp(临时));
                }

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.

eg.

            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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆