2013-03-23 111 views
0

我想刪除與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; 

    } 

} 

請幫我

+0

你不能把條件檢查第一個while循環本身?我的意思是,你根本不需要remove()方法。 – 2013-03-23 06:36:23

+0

在remove()方法中,如果符合條件,則在設置標誌後跳出循環。 – 2013-03-23 06:43:01

回答

0

問題是您要從列表中刪除不匹配的元素。這是因爲你的測試來決定是否應該刪除一個元素是錯誤的。您應該測試是否元素匹配...不是任何元素匹配。

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

... 
    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"); 
} 
2

沒有必要有一個迭代器在remove方法中,可以通過當前LimitOrdercreate方法。

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; 
    } 
} 
+0

它不是那樣的......第二個功能是假設要判斷元素是否被刪除或不... – maddy 2013-03-23 06:38:12

0

更新你的函數remove()來接收和檢查當前迭代器的值。

+0

可以請你打電話給我怎麼做? – maddy 2013-03-23 06:46:50

+0

請參閱@ Arun的示例 – evgenyl 2013-03-23 08:05:28

相關問題