2013-03-23 3 views
0

orderID = 542와 일치하는 단일 요소를 제거하고 싶습니다. 그러나이 프로그램은 해당 목록에서 두 개의 요소를 제거합니다. 실제 프로그램에서 반복자는 arraylist를 반복합니다. 그리고 난arraylist에서 iterating하는 동안 단 하나의 요소를 제거하는 방법

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

루프 자체에서 첫 번째 ID 검사 조건을 넣을 수 있습니까? 즉, remove() 메서드가 전혀 필요하지 않을 수도 있습니다. –

+0

remove() 메서드에서 조건을 충족하는 경우 플래그를 설정 한 후 루프에서 벗어납니다. –

답변

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 메서드의 반복자는에서 현재 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; 
    } 
} 
+0

그게 아니라 ... 두 번째 기능은 요소가 제거되어야하는지 여부를 결정하는 것입니다 ... – maddy

0

현재 반복기 값을 받고 확인하려면 함수()를 업데이트하십시오.

+0

유 어떻게 나 할 수있는 전화 제발? – maddy

+0

@ Arun의 예를 참조하십시오. – evgenyl

관련 문제