개체가 다른 두 개의 목록이 있습니다.
List<Object1> list1;
List<Object2> list2;
특정 속성 (Object1 및 Object2에는 (다른 것 중에서), 하나의 상호 속성 (Long 유형 포함), attributeSame이라는 이름의)을 기반으로 list1의 요소가 list2에 있는지 확인하고 싶습니다.
지금은 이렇게합니다.
boolean found = false;
for(Object1 object1 : list1){
for(Object2 object2: list2){
if(object1.getAttributeSame() == object2.getAttributeSame()){
found = true;
//also do something
}
}
if(!found){
//do something
}
found = false;
}
그러나 나는 이것을하는 더 좋고 더 빠른 방법이 있다고 생각합니다 🙂 누군가 그것을 제안 할 수 있습니까?
감사!
답변
기본 동등성을 테스트해야하는 경우 한 줄의 입력 목록을 수정하지 않고 기본 JDK로 수행 할 수 있습니다.
!Collections.disjoint(list1, list2);
특정 속성을 테스트해야하는 경우 더 어렵습니다. 기본적으로
list1.stream()
.map(Object1::getProperty)
.anyMatch(
list2.stream()
.map(Object2::getProperty)
.collect(toSet())
::contains)
… 이는 고유 한 값을 수집하고 list2
각 값의 list1
존재 여부를 테스트합니다 .
답변
Apache Commons CollectionUtils를 사용할 수 있습니다 .
if(CollectionUtils.containsAny(list1,list2)) {
// do whatever you want
} else {
// do other thing
}
이것은 사용자 정의 개체에 대해 같음 기능을 적절하게 오버로드했다고 가정합니다.
답변
Narendra의 논리를 줄이려면 다음을 사용할 수 있습니다.
boolean var = lis1.stream().anyMatch(element -> list2.contains(element));
답변
이 하나의 방법 의 Collection
이름은 retainAll
있지만, 일부 가진 부작용 당신을 위해 참조
지정된 컬렉션에 포함 된이 목록의 요소 만 유지합니다 (선택적 작업). 즉, 지정된 컬렉션에 포함되지 않은 모든 요소를이 목록에서 제거합니다.
이 목록이 호출의 결과로 변경된 경우 true
같은
boolean b = list1.retainAll(list2);
답변
Loius 대답이 맞습니다. 예를 추가하고 싶습니다.
listOne.add("A");
listOne.add("B");
listOne.add("C");
listTwo.add("D");
listTwo.add("E");
listTwo.add("F");
boolean noElementsInCommon = Collections.disjoint(listOne, listTwo); // true
답변
더 빠른 방법은 추가 공간이 필요합니다.
예를 들면 :
-
한 목록의 모든 항목을 HashSet에 넣습니다 (object.getAttributeSame ()을 사용하려면 직접 해시 함수를 구현해야 함)
-
다른 목록으로 이동하여 HashSet에 항목이 있는지 확인하십시오.
이런 식으로 각 개체는 최대 한 번 방문합니다. HashSet은 O (1)에있는 모든 객체를 확인하거나 삽입하기에 충분히 빠릅니다.
답변
JavaDoc에 따르면 .contains(Object obj)
:
이 목록에 지정된 요소가 포함 된 경우 true를 반환합니다. 보다 공식적으로,이 목록에 (o == null? e == null : o.equals (e))와 같은 요소 e가 하나 이상 포함 된 경우에만 true를 반환합니다.
따라서 .equals()
주어진 객체에 대한 메서드를 재정의하면 다음 을 수행 할 수 있습니다.if(list1.contains(object2))...
요소가 고유 한 경우 (즉, 다른 속성이있는 경우) .equals()
및을 재정의하고 .hashcode()
모든 것을 HashSets
. 이렇게하면 일정한 시간에 다른 요소가 포함되어 있는지 확인할 수 있습니다.