2013-04-17 5 views
0

컬렉션에서 지정된 개체보다 작은 모든 요소를 ​​제거하고 싶습니다. 이것은 내가 가지고있는 것입니다 :컬렉션에서 요소 제거

static void removeAllLessThan(Collection c, Object x) { 
    for(Object a : c) if(a.compareTo(x) < 0) c.remove(a); 
} 

Object는 compareTo 메서드가 없으므로 작동하지 않습니다. 제가 알고 싶은 것은 어떻게 객체들 사이를 비교해야합니까? 또한 자연 비교기는 무엇입니까? 고맙습니다.

+0

'c '는 객체의 모음입니까? –

+3

'Object' 대신에'compareTo'를 구현 한 클래스를 사용하지 않는 이유는 무엇입니까? –

+0

모든 개체에서이 작업을 수행하기 때문에 – GullDe

답변

1

대신 Collection<Comparable>을 사용하고 컬렉션의 모든 항목에 Comparable을 구현하십시오. 그러나,

static <T> void removeAllLessThan(Collection<T> collection, T t) {...} 

이 충분하지 않습니다 : 제네릭을 사용하여

static void removeAllLessThan(Collection<Comparable> c, Comparable x) { 
    for (Iterator<Comparable> it = c.iterator(); it.hasNext();) 
     if (it.next().compareTo(x) < 0) 
      it.remove(); 
} 
0

시작을 호출자가 그 기준으로 필터링하고자하는 객체의 유형을 선언하자 그리고 같이 당신의 방법을 변경합니다. 주문을 제공하려면 Comparator<T>을 사용해야합니다.

static <T> void removeAllLessThan(Collection<T> collection, 
            Comparator<T> comparator, T t) {...} 

그런 다음 상속을 사용하여 작업 할 때 유연성을 허용합니다. 그는 t1 < t2의 상당을 할 수있다, 그러나 비교기는 T의 슈퍼 타입이 될 수 있으며, 컬렉션 T를 확장 아무것도 될 수 있습니다 다음, 삭제 과정에 실수가

static <T> void removeAllLessThan(Collection<? extends T> collection, 
            Comparator<? super T> comparator, T t) {...} 

. 컬렉션을 반복하면서 컬렉션에서 삭제할 수있는 유일한 메커니즘은 Iterator입니다. 그 밖의 것은 ConcurrentModificationException입니다.

static <T> void removeAllLessThan(Iterable<? extends T> iterable, 
            Comparator<? super T> comparator, T t) { 
    for (Iterator<? extends T> it = iterable.iterator(); it.hasNext();) { 
     if (comparator.compare(it.next(), t) < 0) { 
      it.remove(); 
     } 
    } 
} 

서명 변경에 유의하십시오.

마지막으로 매우 구체적인 방법입니다. 당신은

public <T> removeIf(Iterable<? extends T> iterable, 
        Predicate<? super T> predicate){...} 

Predicate 그냥 부울 eval 방법을 가지고 도서관을 많이가 제공하는 인터페이스입니다 서명, 일반적인 removeIf 방법을 쓰기 등 removeIfGreaterThan, removeIfEqualIgnoringCase 같은 거의 동일한 방법을 많이 작성해야합니다.

0

이 문제를 해결하는 방법에는 두 가지가 있습니다.

static void removeAllLessThan(Collection<Comparable> c, Comparable x) { 
    for(Comparable a : c) if(a.compareTo(x) < 0) c.remove(a); 
} 

객체가 comparedTo라는 방법을 가지고 비교해야한다 :

첫째, 당신은 방법으로 변경해야한다는 것을 의미 Comparable 인터페이스를 사용할 수 있습니다.

두 번째로 Comparator을 구현하면 더 큰 것을 판단 할 수 있습니다. 객체를 비교 가능하게하지 않으려면 기존 코드를 변경하여 Comparable을 구현하는 것을 원하지 않는다는 것을 의미합니다. 이는 더 좋은 방법입니다.

다음
static void removeAllLessThan(Collection c, Object x, Comparator comp) { 
    for(Object a : c) if(comp(a, x) < 0) c.remove(a); 
} 

ComparableComparator의 자바 독은 다음과 같습니다으로하지만 코드가 변경됩니다.