当前位置: 首页 > 知识库问答 >
问题:

迭代ArrayList时并发修改异常

须鸿祯
2023-03-14

当我使用temp=iterator.next()时,sort方法会导致并发修改错误。你能帮我解决并发修改错误吗。我给出了整个类的代码,但我只是尝试完成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<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();
            }
        }

共有2个答案

方楷
2023-03-14

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

严劲
2023-03-14

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

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

例如。

            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));
                }
 类似资料:
  • 我对java相当陌生,实际上我正在编写一个键盘记录器,并让它定期写入文件。每当用户按下某个键时,它都会实例化一个NativeKeyEvent,该事件调用“param string()”并将信息作为字符串添加到下面的arraylist中... 然后,在每一个间隔,字符串数组被传递,并被写入下面的TimerTask线程中的文件。 行'str=iterator.next().tostring();‘然后

  • 问题内容: 我正在用Java创建一个多线程聊天。当用户u1向用户u2发送消息但未连接用户u2时,用户u1将消息发送至服务器,而用户u2一旦连接至服务器,便会收到该消息。未发送的消息将添加到ArrayList中。连接用户后,他会检查自己是否是未决邮件的收件人。如果是,则将邮件发送给他,然后将其从待处理邮件列表中删除。这是我的方法: 这就是我得到的: 我如何解决它?是因为我正在使用迭代器吗? 问题答案

  • 我试图从中删除一些元素,同时像这样迭代它: 当然,当尝试在迭代的同时从列表中删除项时,我会得到一个。有没有一些简单的解决方案来解决这个问题?

  • 我有一个json blob,如下所示: 这只是一个在这里发布的例子。在这个例子中,我们看到它提供了一个学校每年发生的所有事件的列表,该列表是一个累积列表,即上一年的事件也会被追加。我们知道的是,每年的活动都将以“会议开始”活动开始。我想通过这件事,以最新的一系列事件结束。请忽略事件名称中的时间戳或年份,它们只是示例,我在现实世界中没有此类信息。我需要的最终结果是: 所以,我想保留从“会话开始”事件

  • 问题内容: 问题发生在 包含该行的代码位于 所有这一切都在里面,这里是一个 当我触摸时,它可能会激活,这将创建另一个具有不同属性的属性,这些属性会从屏幕上掉下来并在不到一秒钟的时间内销毁自己。这是我创建粒子效果的方式。我们可以将其称为“粒子” ,就像构造函数中的参数一样。 一切正常,直到我添加另一个main为止。现在,我同时在屏幕上有两个,如果我触摸最新的,它可以正常工作并启动粒子。 但是,如果我

  • 我正在从数据库resultset获取一个巨大的ArrayList,并尝试在Java中迭代它(尝试从中获取值)。在对其进行迭代时,我在一个特定的行上得到一个concurrentModificationException我尝试使用各种解决方案,但却一次又一次地得到相同的错误,我在下面发布代码 我在myDTo.getsom_num().ToString()这一行上遇到异常。有谁能帮我解决这个问题吗