2012-10-27 4 views
1


Person (이름, 성, 나이)의 ArrayList가 있습니다. 이제이 ArrayList의 하위 집합을 복제하고 싶습니다. 30 세 이상인 Person의 새로운 ArrayList를 만들고 싶다고 가정합니다.
Person의 모든 속성을 읽고 새 ArrayList에 추가하는 반복을 설정하는 것은 그리 복잡하지 않습니다. 그러나 나는 더 이상 "우아하고"어쩌면 좀 더 유연한 방법이 있는지 궁금해하고있다. 어쩌면 내가 누락 된 일부 인터페이스를 구현할 수도있다. 단 하나의 요구 사항 : 기본 Java JDK API를 고수하고 싶습니다.이 목적을 위해 외부 lib를 통합하는 것은 과도합니다.
감사 최대ArrayList : 일부 항목 만 복제합니다.

+0

감사를 시도 자바에있을거야, 난 아직 배운 뭔가 멋진 –

답변

1

당신이 원하는 것은 filter이지만, 표준 API 라이브러리에서 하나의 구현이 존재하지 않는, 인해 폐쇄/람다의 부족과 같은 몇 가지 타사 라이브러리에서 발견 구현 lambdaj은 모두 다른 언어보다 약간 자세한 정보가 필요합니다. 자바 8에서는 아마도 이렇게 바뀔 것이다.

그냥 루프를 반복하면됩니다. 더러운 점이있는 것처럼 느껴지지 않으며, 더 우아한 방법이있을지라도 궁극적으로 루프를 실행합니다.

0

Collections.binarySearch이 당신을 속일 수 있습니다.

여기에 몇 가지 예가 있습니다. Implement binary search in objects

+0

당신 정확히 어떻게 바이너리 검색을 사용하고 싶은지 설명해야합니다. – jogojapan

+0

그는 적절한 코드를 요구하지 않습니다. 검색 방법을 보여줍니다. –

2

나는 당신이 외부 라이브러리를 사용하지 않았다 알고 있지만, 당신이 선택할 않은 경우,이 조각은 도움이 될 :

List<Person> persons = getSomePersons(); 
Collection<Person> greaterThan30 = Collections2.filter(persons, new Predicate<Person>() { 
    public boolean apply(Person person) { 
     return person.age > 30; 
    } 
}); 

는 그것은 Guava Libraries이 필요합니다. 기본적으로 형식 매개 변수를 사용하여 조건부 (Predicate) 클래스를 가져 오는 함수입니다. 수락 할 조건을 리턴하는 하나의 메소드 "적용"이 있습니다.

사람들이 자바를 사용하는 이유 중 하나입니다. 적절한 고차 함수 지원이 없습니다. 예를 들어, 스칼라에서는 다음과 같이 할 수 있습니다.

val greaterThan30 = persons.filter(_.age > 30) 
1

그런 종류의 작업은 LINQ를 사용해야합니다. 그러나 LINQ는 Java에서 아직 사용할 수 없습니다. 계획에 따르면, 거 그 도착하기 전에 내가 루프를 사용하게 될 겁니다하지만 8

는하지만, 모든 의견에 대한 LambdaJ http://code.google.com/p/lambdaj/

+0

Java 8에 들어가는 LINQ에 대한 참조를 제공 할 수 있습니까? –

+0

http://openjdk.java.net/projects/jdk8/features#126 – Wins

+0

LINQ는 아마도 단순한 폐쇄 이상의 것입니다. 그것은 SQL, XML 등등 위에 앉아있는 DSL입니다. –

관련 문제