簡體   English   中英

如何在迭代時從arraylist中刪除一個元素

[英]How to remove just one element from arraylist while iterating over it

我想刪除與orderID = 542匹配的單個元素。但是事實是這個程序正在從該列表中刪除兩個元素。在實際程序中我迭代通過一個arraylist並且我調用一個函數來檢查是否要從該元素中刪除該元素列表和該函數假設從列表中刪除元素

package testMap;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class TestHashMap {
    static ArrayList<LimitOrder> a = new ArrayList<>();

    public static void main(String args[]) {
        create();
    }

    public static void create() {
        LimitOrder l1 = new LimitOrder(1, 100, "145");

        LimitOrder l2 = new LimitOrder(1, 100, "542");

        LimitOrder l3 = new LimitOrder(1, 100, "355");

        a.add(0, l1);
        a.add(1, l2);
        a.add(2, l3);

        Iterator<LimitOrder> i = a.iterator();
        while (i.hasNext()) {
            boolean toremove = false;
            LimitOrder l = i.next();
            toremove=remove();
            if (toremove == true)
            {
                System.out.println("Removed "+l.orderID);
                i.remove();
            }
        }

    }

    public static boolean remove() {
        boolean flag = false;
        Iterator<LimitOrder> i = a.iterator();
        while (i.hasNext()) {
            LimitOrder l = i.next();
            if (l.orderID.equals("542")) {
                flag = true;
            }
        }
        return flag;

    }

}

請幫我

remove方法中不需要迭代器,您可以從create方法傳遞當前的LimitOrder

static ArrayList<LimitOrder> a = new ArrayList<>();

public static void main(String args[]) {
    create();
}

public static void create() {
    LimitOrder l1 = new LimitOrder(1, 100, "145");

    LimitOrder l2 = new LimitOrder(1, 100, "542");

    LimitOrder l3 = new LimitOrder(1, 100, "355");

    a.add(0, l1);
    a.add(1, l2);
    a.add(2, l3);

    Iterator<LimitOrder> i = a.iterator();
    while (i.hasNext()) {
        LimitOrder l = i.next();
        if (remove(l))
        {
            System.out.println("Removed "+l.orderID);
            i.remove();
        }
    }

}

public static boolean remove(LimitOrder l) {
    if (l.orderID.equals("542")) {
        flag = true;
    }
}

更新函數remove()以接收並檢查當前迭代器值。

問題是您要從列表中刪除不匹配的元素。 這種情況正在發生,因為您決定是否應刪除元素的測試是錯誤的。 您應該測試元素是否匹配...如果任何元素匹配則不應該。

修復方法是更改​​測試以僅測試當前元素; 例如

    ...
    Iterator<LimitOrder> i = a.iterator();
    while (i.hasNext()) {
        LimitOrder l = i.next();
        if (isMatch(l)) {
            i.remove();
            System.out.println("Removed " + l.orderID);
        }
    }
    ...

public static boolean isMatch(LimitOrder l) {
    return l.orderID.equals("542");
}

暫無
暫無

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

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