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):使用 aSet来跟踪重复的元素:

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 回答