java - 为什么list上stream操作时生成的map顺序不对

标签 java java-8 java-stream

输入:

RTYUUJKIOO

实际输出:

--R--1
--T--1
--U--2
--Y--1
--I--1
--J--1
--K--1
--O--2

预期输出:

--R--1
--T--1
--Y--1
--U--2
--J--1
--K--1
--I--1
--O--2

不确定为什么在打印期间无法维护订单。

逻辑如下:

static String isValid(String s) 
{
    boolean validString;
    Map<String, Integer> characterFrequencyMap = new HashMap<String, Integer>();

    String[] singleLetterStringArray = s.split("");
    List<String> singleLetterStringList = Arrays.asList(singleLetterStringArray);
    singleLetterStringList.stream().forEachOrdered(l -> {
        Integer frequency;
        if(characterFrequencyMap.containsKey(l)) {
            frequency = characterFrequencyMap.get(l);
            characterFrequencyMap.put(l, frequency + 1);
        } else {
            characterFrequencyMap.put(l, 1);
        }
    });
    Set<String> keys = characterFrequencyMap.keySet();
    Iterator<String> keyItr = keys.iterator();
    while(keyItr.hasNext()) {
        String key = keyItr.next();
        System.out.print("--" + key + "--");
        System.out.println(characterFrequencyMap.get(key));
    }
    return s;
}

最佳答案

HashMap 不维护插入顺序。如果要维护插入顺序,请使用 LinkedHashMap:

Map<String, Integer> characterFrequencyMap = new LinkedHashMap<String, Integer>();

顺便说一句,使用 Stream 生成此 Map 的更好方法是使用 collect():

Map<String,Long> characterFrequencyMap =
    singleLetterStringList.stream()
                          .collect(Collectors.groupingBy (Function.identity (),
                                                          LinkedHashMap::new,
                                                          Collectors.counting()));

关于java - 为什么list上stream操作时生成的map顺序不对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50550619/

相关文章:

performance - 为什么我无法在 32 位和 64 位 JVM 上观察到相同的性能改进?

java - 如何使用代理选项记录(调试)javaagent

java - 复制(不浅也不深)C/C++/Java 等效结构。复制到变量,该变量指向所有成员完全相同的内存

java - Android 应用程序写入 SQLite 数据库

java - 无法使用 Lambda Stream Filter 获得响应

Java - 过滤掉最低整数的汇总列表

java - 更新我的实体时,我的旧实体也会更新

java - 为什么我们需要 Java 8 中的消费者和供应商函数?

java - 在 Function<T,R> 中格式化日期

gradle - JUnit 测试无法正确加载 fop 0.20.5 所需的 xercesImpl jar