簡體   English   中英

使用迭代器時出現 java.util.ConcurrentModificationException 錯誤?

[英]java.util.ConcurrentModificationException error when using iterator?

為什么我在嘗試打印時會遇到這個問題? 我想要做的是顯示放置在數組中的名稱。

    ArrayList <Employee> empArray = new ArrayList();
    LinkedList empyrIncm = new LinkedList();
    ListIterator li = empyrIncm.listIterator();
    DecimalFormat df = new DecimalFormat ("#, ##0.00");

for (int i = 0; i<empArray.size(); i++)
    {
        double yrIncm = empArray.get(i).getSalary() * 12;

        if (yrIncm > 80000)
        {
            empyrIncm.add (new String (empArray.get(i).getEmpName()));

            while(li.hasNext())
            {
                System.out.println ("\nName : " + li.next() + "\nTotal yearly income : " + df.format (yrIncm));
            }
        }
        else
        {
            foundyrIncm = false;
        }
    }

據我所知,我使用的迭代器是在向數組中添加更多輸入時顯示“一一”而不帶“逗號”的名稱。 意思是,不使用迭代器,默認會顯示出來

Name : Object1, Object 2, Object 3, Object 4 
Total yearly income : 123

我不想要那個逗號,而是希望名字和他們的年收入一一顯示出來。 任何幫助,將不勝感激。

您不能將以下兩行的活動與常規的快速失敗迭代器數據結構一起進行即讀和寫:-

empyrIncm.add (new String (empArray.get(i).getEmpName()));
while(li.hasNext())

如果您想同時進行讀寫,請執行以下任一操作:-

empyrIncm.add (new String (empArray.get(i).getEmpName()));
ListIterator li = empyrIncm.listIterator();
while(li.hasNext())

或者

使用CopyOnWriteArrayList而不是 LinkedList/ArrayList。

現在,如果您嘗試打印任何列表,則 API 提供的默認實現會以逗號分隔打印列表中的所有元素,因此您將獲得輸出。

您正在此處向列表中添加元素:

empyrIncm.add (new String (empArray.get(i).getEmpName()));

當您在這里迭代列表時:

System.out.println ("\nName : " + li.next() + "\nTotal yearly income : " + df.format (yrIncm));

java中的迭代器是Fail-fast。 它不允許您在迭代列表時更新列表。

您需要使用CopyOnWriteArrayList而不是LinkedList 通常CopyOnWriteArrayList非常昂貴,因為每次寫入操作都涉及昂貴的 Array 復制。 使用下面的語句。

CopyOnWriteArrayList empyrIncm = new CopyOnWriteArrayList();

您的iterator也將被推遲,直到您需要它為止。 就在while循環之前。

ListIterator li = empyrIncm.listIterator();

嘗試在 while 循環外初始化ListIterator

ArrayList <Employee> empArray = new ArrayList();
LinkedList empyrIncm = new LinkedList();
DecimalFormat df = new DecimalFormat ("#, ##0.00");

for (int i = 0; i<empArray.size(); i++)
{
    double yrIncm = empArray.get(i).getSalary() * 12;

    if (yrIncm > 80000)
    {
        empyrIncm.add (new String (empArray.get(i).getEmpName()));

        ListIterator li = empyrIncm.listIterator();
        while(li.hasNext())
        {
            System.out.println ("\nName : " + li.next() + "\nTotal yearly income : " + df.format (yrIncm));
        }
    }
    else
    {
        foundyrIncm = false;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM