두 목록의 효율적인 교차 자바?
질문은 간단합니다.
두 개의 목록이 있습니다
List<String> columnsOld = DBUtils.GetColumns(db, TableName);
List<String> columnsNew = DBUtils.GetColumns(db, TableName);
그리고 저는 이것들의 교차점을 얻어야합니다. 이것을 달성하는 빠른 방법이 있습니까?
retainAll
방법 을 사용할 수 있습니다 .
columnsOld.retainAll (columnsNew);
preserveAll은 인수 컬렉션을 건드리지 않으므로 더 빠를 것입니다.
List<String> columnsOld = DBUtils.GetColumns(db, TableName);
List<String> columnsNew = DBUtils.GetColumns(db, TableName);
for(int i = columnsNew.size() - 1; i > -1; --i){
String str = columnsNew.get(i);
if(!columnsOld.remove(str))
columnsNew.remove(str);
}
교차는 columnsNew에 남아있는 값이됩니다. columnOld에서 이미 비교 된 값을 제거하면 필요한 비교 수가 줄어 듭니다.
Guava 사용 :
Sets.intersection(Sets.newHashSet(setA), Sets.newHashSet(setB))
어때
private List<String> intersect(List<String> A, List<String> B) {
List<String> rtnList = new LinkedList<>();
for(String dto : A) {
if(B.contains(dto)) {
rtnList.add(dto);
}
}
return rtnList;
}
한 줄의 코드로이를 수행 할 수있는 스트림을 사용하는 좋은 방법이 있으며 containsAll 메소드 afaik에서는 불가능한 동일한 유형이 아닌 두 개의 목록을 사용할 수 있습니다.
columnsOld.stream().filter(c -> columnsNew.contains(c)).collect(Collectors.toList());
유형이 다른 목록의 예입니다. foo와 bar 사이에 현실이 있고 foo에서 bar-object를 얻을 수 있다면 스트림을 수정할 수 있습니다.
List<foo> fooList = new ArrayList<>(Arrays.asList(new foo(), new foo()));
List<bar> barList = new ArrayList<>(Arrays.asList(new bar(), new bar()));
fooList.stream().filter(f -> barList.contains(f.getBar()).collect(Collectors.toList());
두 번째 목록을 세트에 넣으면 HashSet이라고 말하십시오. 그리고 첫 번째 목록을 반복하여 세트에 존재하는지 확인하고 존재하지 않는 경우 제거하면 첫 번째 목록은 결국 필요한 교차점을 갖게됩니다. preserveAll 또는 contains on a list보다 훨씬 빠릅니다. 여기서 강조하는 것은 목록 대신 집합을 사용하는 것입니다. 조회는 O (1)입니다. firstList.retainAll (새 HashSet (secondList))도 작동합니다.
어커런스를 신경 쓰지 않으면 preserveAll을 사용하고 그렇지 않으면 N.intersection을 사용합니다.
a = N.asList(12, 16, 16, 17, 19);
b = N.asList(16, 19, 107);
a.retainAll(b); // [16, 16, 19]
N.println(a);
a = N.asList(12, 16, 16, 17, 19);
b = N.asList(16, 19, 107);
a = N.intersect(a, b);
N.println(a); // [16, 19]
N은 AbacusUtil 의 유틸리티 클래스입니다 .
org.apache.commons.collections4.ListUtils # intersection 사용
참고 URL : https://stackoverflow.com/questions/2400838/efficient-intersection-of-two-liststring-in-java
'developer tip' 카테고리의 다른 글
Ruby on Rails 오류 처리 방법 :“postgresql 어댑터를 설치하십시오 :`gem install activerecord-postgresql-adapter '” (0) | 2020.12.03 |
---|---|
Vim의 자동 완성은 매우 느립니다. (0) | 2020.12.03 |
구조체를 C의 구조체로 복사 (0) | 2020.12.03 |
C # 열거 형에 값 포함 (0) | 2020.12.03 |
WPF의 DataGridColumn에 대한 바인딩 가시성 (0) | 2020.12.03 |