Как отсортировать HashMap

324
18 декабря 2017, 14:06

Как отсортировать HashMap по убывания количества повторений, то есть по Integer ? Если у кого-то есть реализация, буду очень благодарен)

String string = "101010001010101010";
int rate = 8;//8,16,24
HashMap<String, Integer> hashMap = new HashMap<>();
int counter = 0;
StringBuilder buffer = new StringBuilder();
for (int i = 0; i < string.length(); i++) {
    counter++;
    buffer.append(string.charAt(i));
    if (counter == rate) {
        counter = 0;
        Integer frequency = hashMap.get(buffer.toString());
        hashMap.put(buffer.toString(), frequency == null ? 1 : frequency + 1);
        buffer = new StringBuilder();
    }
}
System.out.println("????? ????????? ?????? - "+ rate + " ?????:: ");
String[] arrayKey = hashMap.keySet().toArray(new String[0]);
for (int k = 0; k < arrayKey.length; k++)
{
    System.out.println( arrayKey[k] + " - " + hashMap.get(arrayKey[k]));
}
Answer 1

Отсортировать записи из Map по значениям можно следующим образом, используя Java 8 Stream API:

 List<Map.Entry<String, Integer>> list = map.entrySet().stream()
     .sorted(Comparator.comparing(Map.Entry::getValue))
     .collect(Collectors.toList());

Если нужна сортировка в обратном порядке - чуть-чуть добавится кода:

List<Map.Entry<String, Integer>> list = map.entrySet().stream()
    .sorted(Comparator.<Map.Entry<String, Integer>, Integer>
        comparing(Map.Entry::getValue).reversed())
    .collect(Collectors.toList());

Здесь записи сохраняются в список как есть, однако можно их вывести, оставить только ключи/значения или что-нибудь ещё, по необходимости.

Answer 2

Может так?

String[] arrayKey = hashMap.keySet().toArray(new String[0]);
Integer arr[] = new Integer[arrayKey.length];
for (int k = 0; k < arrayKey.length; k++) {
    Log.i("log__1", " arrayKey[k] - hashMap.get(buffer.toString()) - " + arrayKey[k] + " - " + hashMap.get(arrayKey[k]));
    arr[k] = hashMap.get(arrayKey[k]);
}
Arrays.sort(arr, Collections.reverseOrder());
for(int i = 0; i <  arr.length; i++) {
    Log.i("log__1", arr[i] + "  ");
}
READ ALSO
Кольцо на swing

Кольцо на swing

Добрый деньСуть задачи такова: ввожу N элементов, они отображаются в виде кольца (именно кольцом)

205
Ввод. Selenium Webdriver

Ввод. Selenium Webdriver

Нужно сымитировать нажатие клавишиНе ввод по средствам SendKeys, а именно открыть страницу и сымитировать нажатие кнопки на клавиатуре

239
Задача Java Swing AWT Geomtry, rectangle, Ellipse

Задача Java Swing AWT Geomtry, rectangle, Ellipse

Прямоугольная область задана координатами x1 y1, x2 y2 концов ее диагоналиОбласть разбита на прямоугольники так, что одна сторона разбита на n, а другая...

216