2017-05-04 66 views
3

我有这样的代码:打印输出字符串重复使用HashMap的Java中

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迭代(它已经被事先创建,它只是读取指定的文件和排序后打印出副本按字母顺序排列的字符串)。截至目前,它打印出重复这样:

重复:八= 1,两= 2,七= 2,四个= 1]

等是否有一种方法来打印成对(键=值\键=值等),并没有实际提及独特的话?

我对地图非常陌生,所以即使对于这段代码,我也必须搜索stackoverflow,尽管我脑子里有同样的想法,但是不能想出写出它的好方法。

+2

你的意思是你想要删除计数为1的条目? – KevinO

+0

是的,这个,我想打印出键值对作为常规字符串 – Kirill

回答

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); 

OUTPUT:

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); 
+1

谢谢,我实际上甚至可能使用JDK1.7代码,因为我的一位朋友建议我编写此代码,好像JDK1.8不在那里(为了更好地学习基本知识,我想)。 – Kirill

+0

是的,理解'迭代器'的概念也很重要 – developer

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); 
+0

谢谢!这工作得很好。但是,代码对我来说太高级了,你能解释一下第3行吗? – Kirill

+1

@Kirill的意思是'.filter(e - > e.getValue()> 1)'?这只是说,只有值大于1的条目(即计数大于1的词)应该从流中保留。 –