한 목록에 다른 목록의 요소가 포함되어 있는지 확인합니다.
다른 오브젝트가 있는 리스트가 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
더 빠른 방법은 추가 공간을 필요로 할 것입니다.
예를 들어 다음과 같습니다.
하나의 목록에 있는 모든 항목을 HashSet에 넣습니다(개체.getAttributeSame()을 사용하려면 직접 해시 함수를 구현해야 합니다).
다른 목록을 살펴보고 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
'programing' 카테고리의 다른 글
| SSIS 패키지를 사용하여 Excel 파일을 루프하여 데이터베이스에 로드하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
|---|---|
| Git의 다른 브랜치에 현재 변경을 커밋하는 방법 (0) | 2023.04.14 |
| div의 요소를 수직으로 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
| 심판에게 전달된 목록 - 이 동작을 설명하는 데 도움이 됩니다. (0) | 2023.04.09 |
| Bash를 사용하여 존재하지 않는 서브디렉토리를 재귀적으로 작성하려면 어떻게 해야 합니다. (0) | 2023.04.09 |