为什么在列表中的流操作期间生成的映射不按顺序排列

时间:2018-05-27 09:07:46

标签: java java-8 java-stream

输入:

RTYUUJKIOO

actul输出:

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

2 个答案:

答案 0 :(得分:2)

HashMap不维护广告订单。如果您想维护广告订单,请使用LinkedHashMap

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

BTW,使用Map生成此Stream的更好方法是使用collect()

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

答案 1 :(得分:1)

您遇到的问题是HashMap不维护广告订单而是使用LinkedHashMap

此外,在执行必要的操作之前将字符串拆分为数组然后将其转换为列表是不理想的,您可以直接在字符串上使用chars()方法,然后开始执行必要的操作。

使用流API,可以这样做:

 Map<String, Long> resultSet = 
               s.chars()
                .mapToObj(c -> Character.toString((char) c))
                .collect(groupingBy(Function.identity(),
                        LinkedHashMap::new, counting()));