HashMap不计算重复字符

时间:2018-03-28 13:42:42

标签: java count hashmap character

我的问题是为什么我不能让HASHMAP从多行计算重复的字符,而是输出每个字的字符数,请参阅文本示例:

我们从哪里开始

我认为是城镇之城

中午十二点

import java.io.*;
import java.util.*;

public class DupChar{
  public static void main(String[] args){
    try
    {
    File f = new File("C:/JavaPrograms/text.txt");
    Scanner s = new Scanner(f);
    while (s.hasNextLine()) {
        String line = s.next();
        String lineArr = line.replaceAll("\t", "");
        HashMap<Character, Integer> charMap = new HashMap<Character,  Integer>();
        char[] arr = lineArr.toCharArray();
        for (char value: arr) {
            if (Character.isAlphabetic(value)) {  
                if (charMap.containsKey(value)) {
                    charMap.put(value, charMap.get(value) + 1);
                } else {
                    charMap.put(value, 1);
                    }
            }
        }
    System.out.println(charMap);
    }
    } catch (IOException e) {
        e.printStackTrace();
    }
   }    
}

我的输出是,而不是我想要的:

{e = 1,H = 1}

{r = 1,e = 2,w = 1,h = 1}

{d = 1,o = 1}

{e = 1,w = 1}

2 个答案:

答案 0 :(得分:0)

更改

String line = s.next();

String line = s.nextLine();

其他可能性:

        Map<Character, Integer> charMap = new HashMap<>();

                if (charMap.containsKey(value)) {
                    charMap.put(value, charMap.get(value) + 1);
                } else {
                    charMap.put(value, 1);
                }

简单地

                //charMap.merge(value, 1, (oldv, newv) -> oldv + 1);
                charMap.merge(value, 1, Integer::sum);

五个最常见的条目

让我们使用java Stream;因为那是集合的时髦“查询语言”。

charMap.entrySet().stream()
    .sorted(Comparator.comparing(Map.Entry<Character, Integer>::getValue).reversed())
    .limit(5)
    .forEach(entry -> System.out.printf("'%c' : %d%n", entry.getKey(), entry.getValue()));

以上按降序频率排序。

不幸的是,对于具有相同频率的字符,这变得更加精细。

在字母上排序将是:

charMap.entrySet().stream()
    .sorted(Comparator.comparing(Map.Entry<Character, Integer>::getValue).reversed())
    .limit(5)
    .sorted(Comparator.comparing(Map.Entry<Character, Integer>::getKey))
    .forEach(entry -> System.out.printf("'%c' : %d%n", entry.getKey(), entry.getValue()));

获取2个最高频率,并显示具有这些频率的所有字符:

import java.util.Map.Entry;

            charMap.entrySet().stream()
                    .collect(Collectors.groupingBy(Entry<Character, Integer>::getValue))
                    .entrySet()
                    .stream()
                    .sorted(Comparator.comparing(
                        Entry<Integer, List<Entry<Character, Integer>>>::getKey)
                        .reversed())
                    .limit(2) // To highest frequencies
                    .map(e -> e.getValue())
                    .flatMap(List<Entry<Character, Integer>>::stream)
                    .sorted(Comparator.comparing(Entry<Character, Integer>::getKey))
                    .forEach(entry -> System.out.printf("# '%c' : %d%n",
                                      entry.getKey(), entry.getValue()));

这已经变得难以阅读。

答案 1 :(得分:0)

如果覆盖该键的值

,则HashMap不会保留重复值