Как сравнить длину слов во входном тексте и отсортировать их по значению длины

1

У меня есть строка слов, которые я хочу вернуть, отсортированные по их длине. Некоторые слова повторяются более одного раза, поэтому я использую HashMap для возврата слов и их количества:

Map<String, Integer> map = new HashMap<String, Integer>();

for (String s : fragments) {
    if (map.containsKey(s)) {
        map.put(s, map.get(s) + 1);
    } else {
        map.put(s, 1);
    }

}

Как я могу использовать это, чтобы вернуть длину каждого слова и отсортировать их от самого длинного до кратчайшего?

Изменение: Например, если вход представляет собой строку

"From the torrent, or the fountain,From the red cliff of the mountain"

и я делаю простой цикл:

for (int i = 0; i < fragments.length; i++) {
    System.out.println(fragments[i]+" " +fragments[i].length());
}

выход: (полный выход re: @Pshemo)

from 4
the 3
or 2
the 3
the 3
red 3
cliff 5
of 2
the 3
mountain 8

и так далее. Он несортирован, и слова типа "повторяются" каждый раз, когда он видит это слово. Я хочу не повторять дубликаты и сортировать слова от самого длинного до кратчайшего.

Результат, который я хочу, должен быть:

mountain 8
cliff 5
from 4
the 3
red 3
of 2
or 2
Теги:
sorting
hashmap

1 ответ

2
Лучший ответ

С помощью пользовательского компаратора:

public static void main(String[] args) {
    String phrase = "From the torrent, or the fountain, From the red cliff of the mountain";
    //or whatever method of getting the individual words you want.
    //I just chose StringTokenizer (obviously)
    StringTokenizer st = new StringTokenizer(phrase, " ,");
    TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {

        @Override
        public int compare(String s1, String s2) {
            int retVal = Integer.compare(s1.length(), s2.length());
            if(retVal == 0){
                retVal = s1.compareTo(s2);
            }
            return retVal;
        }
    });
    while(st.hasMoreTokens()){
        ts.add(st.nextToken());
    }
    for(String s : ts.descendingSet()){
        System.out.println(s + " " + s.length());
    }
}

Это будет даже алфавит из слов одинаковой длины :-)

  • 0
    Спасибо! Можете ли вы объяснить, что делает StringTokenizer?
  • 0
    Oopsy. У меня был этот финал для цикла, повторяющегося в увеличивающемся размере. Исправлено, чтобы быть нисходящим, как вы просили.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню