我有一个包含多个重复单词的单词列表。我想提取重复的单词并将它们存储在另一个列表中(保持原始列表的完整性)。
我尝试在列表中迭代,如下所示,但这在逻辑上失败,因为每个'欺骗'在某些时候都将等于主要。我真的想遍历列表,并对列表中的每个字符串检查列表中的所有其他字符串是否有重复项。
List接口中是否有允许这种比较的方法?
参考列表1是字符串列表。
for(String primary: list1){
for(String dupe: list1){
if(primary.equals(dupe)){
System.out.print(primary + " " + dupe);
ds3.add(primary);
}
}
}
编辑:
我应该注意,我知道Set不允许重复,但我正在尝试做的是获取重复项。我想找到它们,然后将它们取出并稍后使用它们。我不是想要根除它们。
答案 0 :(得分: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)
:使用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);
}
答案 1 :(得分:1)
考虑使用Set
。 &#34;不包含重复元素的集合。&#34;
答案 2 :(得分: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);
答案 3 :(得分:0)
要仅获取重复项(而不是从列表中删除重复项),您可以使用集合作为以前字符串访问过的临时查找表:
Set<String> tmp = new HashSet<String>();
for(String primary: list1){
if(tmp.contains(primary)) {
// primary is a duplicate
}
tmp.add(primary);
}