2010-11-18 5 views

답변

13

이미 Google의 Guava 라이브러리를 사용하고 있다면 Collections2.filter() 메소드가 있습니다.이 메소드는 지정된 Predicate과 일치하는 컬렉션의 항목 만 반환합니다.

그러나이 질문에 대한 답이 루핑을 피하는 동기가 무엇인지에 따라 다릅니다. Java 콜렉션에는이 기능이 내장되어 있지 않으므로 방법은 일부 레벨에서 모든 요소를 ​​반복하는 것입니다. Guava는 이것을 내부적으로 수행하지만 수동으로 수행하는 것과 동일한 루프를 계속 수행하고 있으며 더 좋은 API로 마무리했습니다.

1

Apache commons library의 Collections 방법을 사용할 수 있습니다. 그러나 그 방법은 당신을 위해 루프를 수행합니다. 당신이 필요로하는 것을 시도 할 때 당신은 그것을 피할 수 없습니다.

1

코드를 간단하고 이해하기 쉽게 만드는 대체 기능과 같은 기능이 있지만 내부적으로 목록을 반복해야 할 수 있습니다. 그러나 클라이언트가 항상 이것을 사용하지 않을 가능성이 있다면 그들은 좋은 필터링을 실행합니다. 필터 (...) 메소드가 바로 당신을위한 경우

확인 : 어떤 수준에서 Iterables.filter(Iterable, Predicate)

+0

I을 고정하고 (깨진) 링크를 포맷.Javadoc 메소드 링크에는 이스케이프해야하는 문자가 포함되어 있습니다. 또한 Google Collections는 현재 구아바의 일부입니다. –

0

은, 루프는 필연적으로 포함됩니다.

두 데이터 구조가 목록 인 경우 비용은 두 목록 길이의 PRODUCT에 비례합니다. 목록이 클 경우 매우 비쌀 수 있습니다.

이 문제를 방지하려면 목록 중 하나 또는 둘 모두를 간단한 목록보다 빠른 조회를 제공하는 일부 데이터 구조로 나타내야합니다.

1

나는이 개 솔루션

jakarta collection framework에서
  1. 사용 조건을 건의 할 것입니다.
    다른 술어가있을 수 있습니다. 그것들을 결합하여 매우 정교한 필터를 만들 수 있습니다.

  2. 내 기사 읽기 : http://java.dzone.com/articles/useful-abuse, 하위 제목 "필터 패턴 구현"을 검색하십시오.

이 정보가 도움이되기를 바랍니다. 이 당신에게 적절한 목록을 제공 않지만

List result1 = Lists.newArrayList(Collections2.filter(originalList,filterPredicate)); 
List result2 = Lists.newLinkedList(Collections2.filter(originalList,filterPredicate)); 

, 그들은 즉시 저장 오버 헤드와 반복 시간 오버 헤드가 발생 : 구글의 collections libray가 사용

0

. 오히려 그 ("게으른"평가)를 연기하려는 경우 직렬 액세스에 대한의 Iterable 또는 Iterator를 사용할 수 있습니다

Iterable result3 = Iterables.filter(originalList,filterPredicate)); // Pangea's solution 
Iterator result4 = Iterators.filter(originalList.iterator(),filterPredicate)); 

(나는 독자에게 연습으로 유형의 파라미터를 둡니다.)

관련 문제