Вывести счетчик каждого слова в списке в алфавитном порядке - PullRequest
0 голосов
/ 17 июня 2019

Я хочу напечатать счетчик каждого слова в ArrayList в алфавитном порядке. Я реализовал код, но для элемента "hihi" в списке я хочу, чтобы счетчик был 2 вместо 1. Как этого добиться?

 {//some code
                 Collections.sort(list);

            System.out.println("Words with the count");
            Map<String, Long> st1=new TreeMap<>();
            for(String k : list){
                st1.put(k,st1.getOrDefault(k, 0L)+1);
            }
            for(String k : st1.keySet()){
            System.out.println(k+": "+st1.get(k));
        }
    //end of class}

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Посмотрите на использование TreeSet над HashSet. TreeSet упорядочит элементы, используя их естественный порядок. Вы можете передать Comparator в конструктор TreeSet, если вам нужен другой порядок сортировки.

Вы должны заметить, что ваш текущий код немного неэффективен в том смысле, что для получения счетчика частоты приходится перебирать весь список для каждого слова. Вам лучше обработать список заранее, посчитать частоту и сохранить ее на карте. Например:

    Map<String, Long> frequency = new TreeMap<>();
    for (String word : list) {
        frequency.put(word, frequency.getOrDefault(word, 0L) + 1);
    }

    for (String word : frequency.keySet()) {
        System.out.println(word + ": " + frequency.get(word));
    }

Вы также можете сделать это с помощью потоков следующим образом.

    list.stream()
        .collect(Collectors.groupingBy(Function.identity(), TreeMap::new, Collectors.counting()))
        .forEach((k, v) -> System.out.println(k + ": " + v));
1 голос
/ 17 июня 2019

Заказ не гарантируется в HashSet дизайном.

Из документов :

Не дает никаких гарантий относительно порядка итерации множества;

Если вы хотите использовать Set, вам нужно использовать набор, который гарантирует порядок. LinkedHashSet гарантирует порядок вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...