[java] 한 목록에 다른 요소가 포함되어 있는지 확인

개체가 다른 두 개의 목록이 있습니다.

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


답변

더 빠른 방법은 추가 공간이 필요합니다.

예를 들면 :

  1. 한 목록의 모든 항목을 HashSet에 넣습니다 (object.getAttributeSame ()을 사용하려면 직접 해시 함수를 구현해야 함)

  2. 다른 목록으로 이동하여 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. 이렇게하면 일정한 시간에 다른 요소가 포함되어 있는지 확인할 수 있습니다.