2014-03-26 5 views
0

최소 및 최대 범위 사이에서 ArrayList를 필터링하는 메서드를 작성해야한다는 요구 사항이 있습니다. 따라서이 메서드는 List, int min 및 integer max를 허용합니다. 여기에 제가 작성한 방법이 있습니다.기준에 따라 필터 ArrayList

public static List<Integer> filterRange(final List<Integer> l3,int min,int max) 
{ 
    System.out.println(l3); 
    Iterator<Integer> iter = l3.iterator(); 
    while (iter.hasNext()) { 
     int i=iter.next(); 
     if (i<=max && i>=min) { 
      iter.remove(); 
     } 
    } 
    System.out.println(l3); 
    return l3; 

} 

그러나 이것은 원하는 기능을 수행하지 못합니다. 이것에 대한 제안은 좋을 것입니다.

감사

답변

0

당신은 그런 식으로 두 번 next() 기능을 사용하지 못할. 매번 다음 요소를 가져옵니다. min/max과 비교하기 전에 로컬 변수에 next()의 수익을 저장해보십시오.

+0

덕분에, 내가 코드를 수정했습니다. 그것은 지금 잘 작동 :) – user3400060

1

각 요소를 가져 와서 테스트해야합니다. 현재 next() 번을 두 번 연속 호출하고 있습니다. 이 라인이 포함 된 목록 (1,2,3,4)이 있고 첫 번째 반복을 시작하는 경우 그래서 :

if (1<=6 && 2>=2) 

하는 것을 방지하려면 :

if (iter.next().intValue()<=6 && iter.next().intValue()>=2) 

은 동등하다 요소를 저장하고 테스트를 수행하십시오. 당신이 당신의 minmax 매개 변수 값을 사용하지 않는

while (iter.hasNext()) { 
     Integer i = iter.next(); 
     if (i.intValue()<=6 && i.intValue()>=2) { 
      iter.remove(); 
     } 
    } 

참고. 또한 왜 당신이 당신의 방법을 제네릭으로 만들 었는지 나는 모른다. 목록 몇 가지 요소를 포함하고있는 경우에도, 당신이 내 next()을 루프를 호출하지 않을 것입니다 무한하기 때문에 경우 편집 후


는 멀리 떨어져 원래의 게시물에서, 문제는 당신 모르게 next()를 호출이다 귀하의 루프 (왜냐하면 hasNext() 항상 true을 반환합니다). 그래서되어야합니다 :
while (iter.hasNext()) { 
     int i=iter.next(); 
     if (i<=6 && i>=2) { 
      iter.remove(); 
     } 
    } 

는 목록 캔이 null 요소가 포함되어 있음을 알고 있어야합니다, 그래서 Integer 객체의 값을 언 박싱 할 때이 라인 int i=iter.next();는 NPE를 던질 수있다. 당신이 를 사용하는 경우

마지막으로 당신이 할 수있는 (다시 null 요소의 인식) :

l.removeIf(i -> i >= min && i <= max); 
+0

var에 intValue 메서드를 호출 할 필요가 없습니다. – Arjit

+0

@Arjit 예 자동으로 박스가 해제됩니다. 나는 OP의 코드를 붙여 넣기 만하면됩니다 (원래 포스트에서 멀리 떨어진 곳으로 편집하기 전에). –

+0

감사합니다. 변경했습니다 :) – user3400060

1

다음은 filterRange 기능의보다 일반적인 버전입니다. 대등 개체 List<T><T extends Comparable<T>>

  • 높은 값 오브젝트 T
  • 낮은 값 오브젝트 T
  • 가 동일한 목록을 반환하지만, 어떤 개체

    • 리스트 : 이것은 PARAMS로 얻어 제거 된 최소/최대 범위를 벗어났습니다.

      이 함수는 T의 목록을 반복하며 Comparable 인터페이스 메서드 compareTo()을 사용하여 목록의 각 T를 높은 값과 낮은 값과 비교합니다. 항목이 범위 내에 있으면 항목을 새 목록에 추가합니다.

      public static <T extends Comparable<T>> List<T> filterRange(List<T> list, T low, T high){ 
          List<T> newlist = new ArrayList<T>(); 
          for(T t:list) { 
           if(t.compareTo(low)>=0 && t.compareTo(high)<=0) { 
            newlist.add(t); 
           } 
          } 
          return list; 
      } 
      

      는이 코드

      String[] array = new String[]{"apple", "banana", "cherry", 
                 "grape", "kiwi", "lemon", 
                 "lime", "orange", "pear", 
                 "plum", "strawberry"}; 
          List<String> strings = Arrays.asList(array); 
          List<String> array1 = filterRange(strings,"c","h"); 
      

      으로 테스트하고 있어요 :

      cherry 
      grape 
      
    +0

    답변에이 코드를 설명해 주시겠습니까? –

    +0

    @TheGuywithTheHat - 게시물에 원래 제네릭 함수가 지정되어 있으므로 바쁘게 게시했지만 일부 문제가있었습니다. 나는 그것을 약간 청소하고 실제로 그것을 시험했다. – deanosaur

    관련 문제