使用Java中的HashMap打印出字符串重复项

时间:2017-05-04 21:45:41

标签: java hashmap

我有这段代码:

HashMap<String, Integer> dupeMap = new HashMap<>();
                for (String name : sortWords)
                    if(dupeMap.containsKey(name)) {
                        int count = dupeMap.get(name);
                        dupeMap.put(name, ++count);
                    } else {
                        dupeMap.put(name, 1);
                    }

                System.out.printf("Duplicates: %s\n", dupeMap.entrySet());

我希望它在迭代我的ArrayList之后打印出重复项(它是事先创建的,它只是读取给定文件并按字母顺序对字符串进行排序)。截至目前,它以这种方式打印出重复:

  

重复:[8 = 1,2 = 2,7 = 2,4 = 1]

等。有没有办法将它成对打印出来(key = value \ n key = value等)并且没有实际提到独特的单词?

我是地图的新手,所以即使是这段代码,我也要搜索stackoverflow,虽然我脑子里有同样的想法,但却无法想出一个好的方法来编写它。

2 个答案:

答案 0 :(得分:5)

过滤条目集以删除值为1的元素:

List<Map.Entry<String, Integer>> dupes = dupeMap.entrySet()
    .stream()
    .filter(e -> e.getValue() > 1)
    .collect(Collectors.toList());

然后:

System.out.printf("Duplicates: %s\n", dupes);

答案 1 :(得分:4)

您还可以在removeIf()上使用entrySet()(在JDK1.8中添加)来删除仅发生一次的字词,如下所示:

Set<Map.Entry<String, Integer>> elements = dupeMap.entrySet();
elements.removeIf(element->element.getValue() ==1);//removes words ocured only once
System.out.printf("Duplicates: %s\n",elements);

<强>输出:

Duplicates: [Two=2, Seven=2]

如果您使用的是JDK1.7或更早版本,则需要使用Iterator安全删除仅出现一次的字词,如下所示:

Set<Map.Entry<String, Integer>> elements = dupeMap.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = elements.iterator();
while(iterator.hasNext()) {
   Map.Entry<String, Integer> element = iterator.next();
   if(element.getValue() ==1) {
       iterator.remove();
    }
}
System.out.printf("Duplicatesss: %s\n",elements);