powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сортировка Map по ключу
19 сообщений из 19, страница 1 из 1
Сортировка Map по ключу
    #39551881
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Сортирую Map по ключу через List -> Sort -> Comparator

Почему для 'e1.getKey()' не доступен метод 'compareTo()'?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
package mapsorttest03;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class MapSortTest03 {

public static void main(String[] args) {

String[][] stateArray = {{"Russia", "Moscow"}, {"Turkey", "Ankara"}, {"England", "London"}};
Map<String, String> stateMap = new HashMap(Arrays.stream(stateArray).collect(Collectors.toMap(e -> e[0], e -> e[1])));
List<Map.Entry> stateList = new ArrayList(stateMap.entrySet());

Collections.sort(stateList, new Comparator<Map.Entry>() {

@Override
public int compare(Map.Entry e1, Map.Entry e2) {
  return e1.getKey().compareTo(e2.getKey());
}
});
}
}
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39551889
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл ошибку. Исправил Map.Entry на Map.Entry<String, String>

Окончательный код с Map -> List - > Sort, Comparator -> LinkedHashMap.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class MapSortTest03 {

    public static void main(String[] args) {

        String[][] stateArray = {{"Russia", "Moscow"}, {"Turkey", "Ankara"}, {"England", "London"}};
        Map<String, String> stateMap = new HashMap(Arrays.stream(stateArray).collect(Collectors.toMap(e -> e[0], e -> e[1])));       
        List<Map.Entry<String, String>> list = new ArrayList(stateMap.entrySet());
        
        System.out.println(stateMap);

        Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
                return (o2.getKey()).compareTo(o1.getKey());
            }
        });
        
        Map<String, String> sortedMap = new LinkedHashMap();
        for(Map.Entry<String, String> entry : list) {
            sortedMap.put(entry.getKey(), entry.getValue());
        }
        
        System.out.println(sortedMap);
    }
}
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39551909
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

говнокод какой-то

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
package com.company;

import java.util.*;

public class Main {

    public static void main(String[] args) {
        String[][] stateArray = {{"Russia", "Moscow"},
                                 {"Turkey", "Ankara"},
                                 {"England", "London"},
                                 {"Australia", "Canberra"}};
        Map<String, String> sortedMap = new TreeMap<>();
        Arrays.stream(stateArray).forEach(e->{
            sortedMap.put(e[0], e[1]);
        });
        System.out.println(sortedMap);
    }
}
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39552326
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Map<String, String> map = new HashMap<>();
        map.put("Russia", "Moscow");
        map.put("Turkey", "Ankara");
        map.put("England", "London");
        map.put("Australia", "Canberra");

        LinkedHashMap<String, String> collect = map
                .entrySet()
                .stream()
                .sorted(comparingByKey())
                .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39552358
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Молодца!
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39552465
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulT,

Молодца!
Мерси:)
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39552979
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Map<String, String> map = new HashMap<>();
        map.put("Russia", "Moscow");
        map.put("Turkey", "Ankara");
        map.put("England", "London");
        map.put("Australia", "Canberra");

        LinkedHashMap<String, String> collect = map
                .entrySet()
                .stream()
                .sorted(comparingByKey())
                .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));



Помогите разобраться:
На этапе
Код: java
1.
2.
3.
4.
        
LinkedHashMap<String, String> collect = map
      .entrySet()
      .stream()


мы получаем объект Stream<Map.Entry<K,V>>.
Затем на нем мы вызываем метод sorted , в который подаем компаратор, получаемый через статический метод comparingByKey() .
На каком классе мы его вызываем ?
Почему не Map.Entry<String,String>.comparingByKey() ?
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39552981
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,

Static Import
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39553232
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, а почему не предлагается использовать TreeMap, если ТСу нужен отсортированный Map?
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39553251
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лысый дядькаСкажите, а почему не предлагается использовать TreeMap, если ТСу нужен отсортированный Map?
Можно и TreeMap всё зависит от задачи.
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39553277
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лысый дядька,
Вопрос темы так поставлен.
Понятно, что можно перекинуть в более подходящую коллекцию или изначально работать с сортированной и без дублей ключей.
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39553934
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лысый дядькаMolasar,

говнокод какой-то

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
package com.company;

import java.util.*;

public class Main {

    public static void main(String[] args) {
        String[][] stateArray = {{"Russia", "Moscow"},
                                 {"Turkey", "Ankara"},
                                 {"England", "London"},
                                 {"Australia", "Canberra"}};
        Map<String, String> sortedMap = new TreeMap<>();
        Arrays.stream(stateArray).forEach(e->{
            sortedMap.put(e[0], e[1]);
        });
        System.out.println(sortedMap);
    }
}


+1, наилучшее как по мне.
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39554007
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892+1, наилучшее как по мне.
Да, хрена. Лямбды с телом это ужас. При этом городить стрим тупо ради цикла это совсем уже.
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39554010
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
SortedMap<String, String> capitals = new TreeMap<>(Map.of("Russia", "Moscow", "Turkey", "Ankara", "England", "London"));
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39555772
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что означает (e1, e2) -> e2?
JulT
Код: java
1.
                .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39555775
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarЧто означает (e1, e2) -> e2?
Код: java
1.
2.
3.
4.
5.
6.
new java.util.function.BinaryOperator<String>() {
    @Override
    public String apply(String e1, String e2) {
        return e2;
    } 
}
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39555776
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, как я понял:
e1 - ключ, по которому сортируем,
e2 - значение.
В данном случае возвращаем значение e2:
(e1, e2) -> e2

Если бы сортировка была по значению, то правильно было бы:
(e1, e2) -> e1

Я правильно понял?
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39555782
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

Метод apply будет вызван в том случае, если в процессе remapping'а возникнут коллизии значений от одного ключа.
Но так как в данном случае remapping происходит от Map, то вероятность возникновения коллизий (повторения) ключей сводится к нулю.
Поэтому в данном случае смело подставляется значение (а не ключ).

кейс когда будет вызов merge-функции:
Код: java
1.
2.
3.
4.
5.
"Russia", "SPb"
"Russia", "Moscow" // будет вызов apply(), т.к. ключ Russia встретился во 2-й раз, 
                   // мы подставляем e2 (Moscow) и соот-но затираем старое значение (Spb).
                   // либо - генерим другой ключ при помощи конкатенации + уникальный суффикс, например, Russia1, Russia2 и т.д.
                   // но это для того, если мы хотим сохранить значение (очень редко)
...
Рейтинг: 0 / 0
Сортировка Map по ключу
    #39555789
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman
Код: java
1.
2.
                   // либо - генерим другой ключ при помощи конкатенации + уникальный суффикс, например, Russia1, Russia2 и т.д.
                   // но это для того, если мы хотим сохранить значение (очень редко)

ну, и третий вариант - самый правильный:
Код: java
1.
(e1, e2) -> { throw new IllegalStateException(String.format("Duplicate key %s", e1)); };
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сортировка Map по ключу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]