2017-04-22 8 views
-2

사용자 정의 필터 메서드를 사용하여 임의의 객체 컬렉션을 필터링하고 객체의 ID 해시 코드 (생성 된 객체에 대한 고유 한 해시 코드)를 반환하는 1 개의 메소드가 포함 된 Java 라이브러리 모듈을 구현해야합니다. JVM에 의해) Java 8 구조를 사용하는 것이 바람직합니다. 여러 오브젝트가있는 경우, 가장 큰 오브젝트가 리턴되어야합니다. 비교자가 일의의 값을 소트하지 않는 경우는, 최대의 해시 코드가 돌려 주어집니다. 이 방법은 아래에서 찾을 수있는 서명을 따라야합니다.Java 컬렉션 필터 비교 자

collection.removeIf(filter.negate()); 

하지만, 내가 얻을 수있는 것을, 당신은 가장 큰 임의의 객체를 어떻게 얻을 수됩니다 :

public <T> Optional<Integer> getIt(Collection<T> collection, Predicate<T> filter, Comparator<T> comparator) 

그래서, 사용, 처음으로 필터링 할 생각? 어떤 도움에 감사드립니다

, 감사

답변

1

스트림 API는 상대적으로 간단한 솔루션을 수행합니다

public <T> Optional<Integer> getIt(Collection<T> collection, Predicate<T> filter, Comparator<T> comparator) { 
    return collection.stream() 
     .filter(filter) 
     .max(comparator.thenComparingInt(System::identityHashCode)) 
     .map(System::identityHashCode); 
} 

편집 : 주석 기, Mike Nakis이 나에게 지적이 질문에 가능성이 있음 "숙제 도우미"범주에 속합니다. 첫 번째 단계에서 내가 놓친 관찰입니다. 진정으로 수업에 도움이 필요하시면 솔직히이 글의 해결책을 사용하십시오. Stack Overflow 응답에는 항상 속성이 필요하며 사용자가 입력 한 코드는 적어도이 질문에 대한 링크를 제공해야합니다.

+0

1. 숙제 질문에 실제 코드로 대답하는 것은 윤리적으로 의심 스럽습니다. 2. 스트림 솔루션이 인상적이지만, OP가 이것을 열면 그의 교수는 다른 누군가가 그를 위해 작성했다고 즉시 알게됩니다. –

+0

다시 말하면 "Java 8 구문을 사용하는 것이 좋습니다"라는 메시지가 표시되므로 스트림 솔루션이 예상대로 될 수 있습니다. 하지만 여전히 숙제 문제에 코드로 대답하는 것은 좋지 않습니다. –

+0

@MikeNakis 다시 질문을 보면 숙제 도움과 너무 흡사하게 보입니다. 초기 패스에서는 고용주 요구 사항처럼 보였지만 너무 빨리 스캔 한 것 같습니다. – gyre

1

필터링 된 컬렉션을 ArrayList에 넣은 다음 비교기를 허용하는 sort() 메서드를 호출해야합니다.

그러나 문제의 정의에 따라 개체를 고유하게 정렬 할 수 없으므로 제공된 비교기를 사용할 수 없습니다. 따라서 다음과 같은 비교기를 제공해야합니다.

먼저 제공된 비교기를 호출합니다. 0이 아닌 다른 것을 반환하면 그 결과를 반환합니다. 제공된 비교자가 0을 반환하면 두 객체의 ID 해시 코드를 계산하고 두 해시 코드를 비교 한 다음 그 비교 결과를 반환합니다.