1

複数の重複する単語を含む単語のリストがあります。重複している単語を抽出して別のリストに保存したい (元のリストの整合性を維持する)。

以下に示すようにリストを繰り返してみましたが、すべての「重複」がある時点でプライマリと等しくなるため、これは論理的に失敗します。リストを繰り返し処理し、リスト内のすべての文字列について、リスト内のすべてのその他の文字列の重複をチェックしたいと思います。

このタイプの比較を可能にする List インターフェイスのメソッドはありますか?

参照リスト 1 は文字列のリストです。

for(String primary: list1){
    for(String dupe: list1){
        if(primary.equals(dupe)){
            System.out.print(primary + " " + dupe);
            ds3.add(primary);
        }
    }
}

編集:

Set では重複が許可されていないことは承知していますが、私がやろうとしているのは重複を取得することです。それらを見つけて、取り出して後で使用したい。私はそれらを根絶しようとしているわけではありません。

4

4 に答える 4

4

重複を削除する最も簡単な方法は、すべての要素を に追加することSetです。

Set<String> nodups = new LinkedHashSet<String>(list1);
List<String> ds3 = new ArrayList<String>(nodups);

上記のコードでds3は、重複なしになります。で重複している要素を見つけることに興味がある場合は、次のようにしますO(n)

Map<String, Integer> counter = new LinkedHashMap<String, Integer>();
for (String s : list1) {
    if (counter.containsKey(s))
        counter.put(s, counter.get(s) + 1);
    else
        counter.put(s, 1);
}

上記を使用すると、重複した要素を簡単に見つけることができます。

List<String> ds3 = new ArrayList<String>();
for (Map.Entry<String, Integer> entry : counter.entrySet())
    if (entry.getValue() > 1)
        ds3.add(entry.getKey());

さらに別の方法O(n): a を使用しSetて、複製された要素を追跡します。

Set<String> seen = new HashSet<String>();
List<String> ds3 = new ArrayList<String>();
for (String s : list1) {
    if (seen.contains(s))
        ds3.add(s);
    else
        seen.add(s);
}
于 2013-07-14T22:39:13.573 に答える
1

の使用を検討してくださいSet。「重複要素を含まないコレクション。」

于 2013-07-14T22:39:09.890 に答える
1

意図は、重複を完全に失うことなく抽出することです

List<String> list =
Set<String> set = new LinkedHashSet<>(); // to keep he order
List<String> dups = new ArrayList<String>(); // could be duplicate duplicates
for(String s: list)
    if (!set.add(s)) dups.add(s);
于 2013-07-14T22:42:48.417 に答える
0

重複のみを取得するには (リストから重複を削除するのではなく)、以前にアクセスした文字列の一時的なルックアップ テーブルとしてセットを使用できます。

Set<String> tmp = new HashSet<String>();
for(String primary: list1){
  if(tmp.contains(primary)) {
    // primary is a duplicate
  }
  tmp.add(primary);
}
于 2013-07-14T22:47:01.087 に答える