이 답변에 속임수가 없다고 말하고 싶습니다.
Bloch는 필수적이고 훌륭하고 간결한 Effective Java 에서 항목 47에서 "라이브러리를 알고 사용하십시오"라는 제목으로 "바퀴를 재발 명하지 마십시오"라고 말합니다. 그리고 그는 몇 가지 매우 분명한 이유를 제시합니다.
여기 CollectionUtils
에 Apache Commons Collections 라이브러리의 메소드를 제안하는 몇 가지 답변이 있지만 이 질문에 대답하는 가장 아름답고 우아한 방법은 없습니다 .
Collection<Object> culprits = CollectionUtils.disjunction( list1, list2 );
if( ! culprits.isEmpty() ){
// ... do something with the culprits, i.e. elements which are not common
}
Culprits : 즉 둘 다 공통적이지 않은 요소 Lists
. 에 속하는 범인 결정 list1
하고있는 list2
비교적 간단 사용 CollectionUtils.intersection( list1, culprits )
하고 CollectionUtils.intersection( list2, culprits )
.
그러나 { "a", "a", "b"} disjunction
와 { "a", "b", "b"}와 같은 경우에는 소프트웨어가 실패하지 않는 것을 제외하고는 차이가 있습니다. 원하는 작업의 미묘함 / 모호함의 본질.
Apache 엔지니어가 생성 한 것과 같은 작업에 대해서는 항상 소스 코드 (l. 287)를 검사 할 수 있습니다 . 코드를 사용하면 얻을 수있는 이점 중 하나는 코드를 철저히 시도하고 테스트했을뿐 아니라 여러 가지 중요한 사례와 문제가 예상되고 처리된다는 것입니다. 필요한 경우이 코드를 복사하여 마음의 내용에 맞게 조정할 수 있습니다.
NB 저는 처음에는 CollectionUtils
자신에게 직접 적용 할 수있는 오버로드 된 버전을 제공하는 방법 이 없다는 것에 실망했습니다 Comparator
(따라서 equals
목적에 맞게 재정의 할 수 있음 ).
그러나 collections4 4.0에는 Equator
"T 유형의 객체 간 동등성을 결정하는" 새로운 클래스가 있습니다. collections4 CollectionUtils.java의 소스 코드를 살펴보면 몇 가지 메소드와 함께 이것을 사용하는 것 같지만 CardinalityHelper
클래스를 사용하여 파일 상단의 메소드에는 적용 할 수 없습니다 ... 포함 disjunction
하고 intersection
.
나는 그것이 아닌 사소한 때문에 아파치 사람들이 아직이 주위에 도착하지 않은 것으로 추측 : 당신이 대신 요소의 고유 사용하는 "AbstractEquatingCollection"클래스, 같은 것을 만들어야 할 것입니다 equals
및 hashCode
방법을 대신들을 사용하는 것을 의 Equator
와 같은 모든 기본적인 방법에 대한 add
, contains
등 NB는 소스 코드를 볼 때 실제로 AbstractCollection
구현하지 않습니다 add
,도 등의 추상적 인 서브 클래스를 할 AbstractSet
... 당신과 같은 구체적인 클래스까지 기다려야 HashSet
및 ArrayList
이전 add
구현됩니다. 꽤 두통.
그동안이 공간을 지켜봐야한다고 생각합니다. 분명한 임시 해결책은 모든 요소를 맞춤형 래퍼 클래스로 래핑하여 원하는 평등 을 사용 equals
하고 hashCode
구현 한 Collections
다음 래퍼 객체 를 조작하는 것 입니다.