73

質問は簡単です:

私は2つのリストを持っています

List<String> columnsOld = DBUtils.GetColumns(db, TableName);
List<String> columnsNew = DBUtils.GetColumns(db, TableName);

そして、私はこれらの交差点を取得する必要があります。これを達成するための簡単な方法はありますか?

4

8 に答える 8

123

retainAll次の方法を使用できます。

columnsOld.retainAll (columnsNew);
于 2010-03-08T11:17:27.427 に答える
20

GoogleのGuavaライブラリを使用する:

Sets.intersection(Sets.newHashSet(setA), Sets.newHashSet(setB))

注:これは、2つのリストとの交差を単純に行うよりもはるかに効率的です。リストバージョンのO(n×m)に対して、O(n + m)です。200万アイテムのリストがある場合、それは数百万の操作と数の操作の違いです。

于 2013-03-28T14:27:21.137 に答える
19

holdAllは引数コレクションに影響を与えないため、これはより高速になります。

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に残された値になります。columnsOldからすでに比較された値を削除すると、必要な比較の数が減ります。

于 2010-03-08T12:24:03.430 に答える
9

どうですか

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;
}
于 2013-01-05T22:45:52.513 に答える
4

これを1行のコードで実行できるストリームには優れた方法があり、containsAllメソッドafaikでは不可能な同じタイプではない2つのリストを実行できます。

columnsOld.stream().filter(c -> columnsNew.contains(c)).collect(Collectors.toList());

さまざまなタイプのリストの例。fooとbarの間に現実があり、ストリームを変更するよりもfooからbarオブジェクトを取得できる場合:

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());
于 2014-09-11T15:09:24.380 に答える
3

発生を気にしない場合はretainAllを使用し、それ以外の場合は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はそろばん共通のユーティリティクラスです

于 2016-11-09T00:20:27.377 に答える
1

2番目のリストをセットに入れる場合は、HashSetと言います。そして、最初のリストを繰り返して、セットに存在するかどうかを確認し、存在しない場合は削除します。最初のリストには、最終的に必要な交差点が含まれます。これは、retainAllまたはリストに含まれるよりもはるかに高速です。ここで強調するのは、リストの代わりにセットを使用することです。ルックアップはO(1)です。firstList.retainAll(新しいHashSet(secondList))も機能します。

于 2016-05-06T23:56:45.723 に答える
0

org.apache.commons.collections4.ListUtils#intersectionを使用します

于 2019-04-09T08:09:16.943 に答える