【问题标题】:HashMap not counting duplicate charactersHashMap 不计算重复字符
【发布时间】:2018-03-28 13:42:41
【问题描述】:

我的问题是为什么我不能让 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}

【问题讨论】:

    标签: java count hashmap character


    【解决方案1】:

    改变

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

    这已经变得难以阅读了。

    【讨论】:

    • 再次非常感谢。发布以进行更正的代码的第一个问题尚未排序。我觉得我之前反应太快了。查看我的输出;它尚未修复,例如仍然在两个或多个位置计算一个字符。请再看一遍代码;将等待。
    • 我按频率递减排序。添加了一些变体。我希望它能让您体验一下 java Streams。
    【解决方案2】:

    如果覆盖该键的值,HashMap 不会保存重复值

    【讨论】:

    • Kushavaha 你的意思是hashSet()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多