Чтобы построить map
с Java 7, вы можете сделать это следующим образом.
// convert to lower case from the start
testString = rd.readLine().toLowerCase();
Map<Character, List<Character>> map = new HashMap<>();
for (int i = 0; i < testString.length(); i++) {
char someChar = testString.charAt(i);
if (someChar == ' ') {
continue;
}
// try and get the list
List<Character> characters = map.get(someChar);
if (characters == null) {
// otherwise, create it
characters = new ArrayList<>();
// and put it in the map
map.put(someChar, characters);
}
// add characters to the obtained list.
characters.add(someChar);
}
Для Comparator
и других подобных реализаций я предпочитаю использовать `локальные классы. Imo они чище анонимных классов, но требуют дополнительного синтаксиса. Если вы не знакомы с ними, это будет go внутри вашего основного класса.
static class CountThenLex implements
Comparator<Entry<Character, List <Character>>> {
public int compare(
Entry<Character, List<Character>> a,
Entry<Character, List <Character>> b) {
int asize = a.getValue().size();
int bsize = b.getValue().size();
// note that b is sorted first for descending count order.
int aTob = bsize > asize ? 1 :
bsize < asize ? -1 : 0;
if (aTob != 0) {
return aTob;
}
// if the counts are equal, then sort lexically. Since the Character
// class implements `Comparable` you can use the natural ordering.
return a.getKey().compareTo(b.getKey());
}
}
Тогда вы просто вызываете sort с экземпляром класса.
Collections.sort(list, new CountThenLex());
You Также придется изменить ваш метод печати, а также другие методы, так как присутствуют другие функции Java 8. Вот базовое c решение для печати.
for(Entry<?,List<Character>> e : list) {
for (char c : e.getValue()) {
System.out.print(c);
}
}
System.out.println();