У меня есть строка слов, которые я хочу вернуть, отсортированные по их длине. Некоторые слова повторяются более одного раза, поэтому я использую 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
С помощью пользовательского компаратора:
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());
}
}
Это будет даже алфавит из слов одинаковой длины :-)