Почему карта, сгенерированная во время работы потока в списке, не в порядке - PullRequest
0 голосов
/ 27 мая 2018

ввод:

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 голосов
/ 27 мая 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что HashMap не поддерживает порядок вставки, вместо этого используйте LinkedHashMap.

Далее, разбивая строку на массив, затем преобразуйте ее в список перед выполнением необходимогоОперации неоптимальны, вы можете использовать метод chars() непосредственно в строке, а затем начать выполнять необходимые операции.

Используя потоковый API, можно сделать:

 Map<String, Long> resultSet = 
               s.chars()
                .mapToObj(c -> Character.toString((char) c))
                .collect(groupingBy(Function.identity(),
                        LinkedHashMap::new, counting()));
0 голосов
/ 27 мая 2018

HashMap не поддерживает порядок вставки.Если вы хотите сохранить порядок вставки, используйте LinkedHashMap:

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

BTW, лучший способ создать это Map с Stream s - collect():

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