programing

한 목록에 다른 목록의 요소가 포함되어 있는지 확인합니다.

easyjava 2023. 4. 9. 22:33
반응형

한 목록에 다른 목록의 요소가 포함되어 있는지 확인합니다.

다른 오브젝트가 있는 리스트가 2개 있어요.

List<Object1> list1;
List<Object2> list2;

list1의 요소가 list2에 존재하는지 여부를 특정 속성(Object1과 Object2)에 근거하여 상호 속성(종류 Long)이 1개 있고 attributeSame이라는 이름이 붙어 있는지 확인합니다.

지금은 이렇게 하고 있어요.

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존재감을 위해서.

Narendra의 논리를 간략하게 하기 위해 다음을 사용할 수 있습니다.

boolean var = lis1.stream().anyMatch(element -> list2.contains(element));

Apache Commons Collection Utils를 사용할 수 있습니다.

if(CollectionUtils.containsAny(list1,list2)) {  
    // do whatever you want
} else { 
    // do other thing 
}  

이 경우 커스텀오브젝트에 대해 동등한 기능이 올바르게 오버로드되어 있는 것을 전제로 되어 있습니다.

하는 방법이 하나 있다.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에 넣습니다(개체.getAttributeSame()을 사용하려면 직접 해시 함수를 구현해야 합니다).

  2. 다른 목록을 살펴보고 HashSet에 항목이 있는지 확인합니다.

이 방법으로 각 오브젝트는 최대 한 번 방문됩니다.또한 HashSet은 O(1)에 개체를 확인하거나 삽입할 수 있을 만큼 빠릅니다.

의 JavaDoc에 따르면:

이 목록에 지정된 요소가 포함되어 있으면 true를 반환합니다.보다 형식적으로 는 이 목록에 하나 이상의 요소 e가 포함된 경우에만 true를 반환합니다(o==syslog? e==syslog : o.syslog(e)).

그래서 만약 당신이 이 모든 것을 덮어쓰게 되면.equals()지정된 오브젝트에 대한 메서드는 다음을 수행할 수 있어야 합니다.if(list1.contains(object2))...

요소가 고유할 경우(즉,다른 Atribute를 사용)를 덮어쓸 수 있습니다..equals() ★★★★★★★★★★★★★★★★★」.hashcode()모든 것을 저장합니다.이렇게 하면 한 요소에 다른 요소가 일정 시간에 포함되어 있는지 확인할 수 있습니다.

보다 빠르게 하기 위해 브레이크를 추가할 수 있습니다.그러면 발견된 루프가 true로 설정되어 있으면 루프가 정지됩니다.

boolean found = false;
for(Object1 object1 : list1){
   for(Object2 object2: list2){
       if(object1.getAttributeSame() == object2.getAttributeSame()){
           found = true;
           //also do something  
           break;
       }
    }
    if(!found){
        //do something
    }
    found = false;
}

attributeSame 키를 가진 목록이 아닌 맵을 사용하는 경우 두 번째 맵에 대응하는 값이 있는지 여부를 한 맵에서 빠르게 확인할 수 있습니다.

보유하고 있는 데이터의 유형을 정의할 수 있습니까? 빅 데이터입니까? 정렬되어 있습니까?데이터에 따라 다른 효율성 접근법을 고려해야 할 것 같습니다.

예를 들어 데이터가 크고 정렬되지 않은 경우 인덱스별로 두 목록을 함께 반복하여 각 목록 속성을 다른 목록 도우미에 저장할 수 있습니다.그러면 도우미 목록의 현재 Atribute를 사용하여 크로스 체크할 수 있습니다.

행운을 빌어요

edited :또한 같은 오버로드를 권장하지 않습니다.위험하고 아마도 당신의 목적과 어긋나겠죠

org.springframework.springfrack컬렉션 유틸리티

boolean containsAny(java.util.Collection<?> source, java.util.Collection<?> candidates)

Return true if any element in 'candidates' is contained in 'source'; otherwise returns false

를 사용하면 다음과 같이 목록에 다른 목록의 요소가 포함되어 있는지 확인할 수 있습니다.

boolean var = lis1.stream().filter(element -> list2.contains(element)).findFirst().isPresent();

언급URL : https://stackoverflow.com/questions/11796371/check-if-one-list-contains-element-from-the-other

반응형