Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сортировка Map по ключу / 19 сообщений из 19, страница 1 из 1
12.11.2017, 23:44
    #39551881
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Всем привет!

Сортирую 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
13.11.2017, 00:31
    #39551889
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Нашёл ошибку. Исправил 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
13.11.2017, 07:27
    #39551909
Лысый дядька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
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
13.11.2017, 15:53
    #39552326
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Код: 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
13.11.2017, 16:27
    #39552358
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
JulT,

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

Молодца!
Мерси:)
...
Рейтинг: 0 / 0
14.11.2017, 17:05
    #39552979
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
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
14.11.2017, 17:07
    #39552981
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
faustgreen,

Static Import
...
Рейтинг: 0 / 0
15.11.2017, 08:59
    #39553232
Лысый дядька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Скажите, а почему не предлагается использовать TreeMap, если ТСу нужен отсортированный Map?
...
Рейтинг: 0 / 0
15.11.2017, 09:24
    #39553251
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Лысый дядькаСкажите, а почему не предлагается использовать TreeMap, если ТСу нужен отсортированный Map?
Можно и TreeMap всё зависит от задачи.
...
Рейтинг: 0 / 0
15.11.2017, 10:03
    #39553277
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Лысый дядька,
Вопрос темы так поставлен.
Понятно, что можно перекинуть в более подходящую коллекцию или изначально работать с сортированной и без дублей ключей.
...
Рейтинг: 0 / 0
16.11.2017, 00:03
    #39553934
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Лысый дядька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
16.11.2017, 08:23
    #39554007
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
no56892+1, наилучшее как по мне.
Да, хрена. Лямбды с телом это ужас. При этом городить стрим тупо ради цикла это совсем уже.
...
Рейтинг: 0 / 0
16.11.2017, 08:29
    #39554010
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Код: java
1.
SortedMap<String, String> capitals = new TreeMap<>(Map.of("Russia", "Moscow", "Turkey", "Ankara", "England", "London"));
...
Рейтинг: 0 / 0
19.11.2017, 18:38
    #39555772
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Что означает (e1, e2) -> e2?
JulT
Код: java
1.
                .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));
...
Рейтинг: 0 / 0
19.11.2017, 18:49
    #39555775
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
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
19.11.2017, 18:56
    #39555776
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Usman, как я понял:
e1 - ключ, по которому сортируем,
e2 - значение.
В данном случае возвращаем значение e2:
(e1, e2) -> e2

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

Я правильно понял?
...
Рейтинг: 0 / 0
19.11.2017, 19:24
    #39555782
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
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
19.11.2017, 19:34
    #39555789
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Map по ключу
Usman
Код: java
1.
2.
                   // либо - генерим другой ключ при помощи конкатенации + уникальный суффикс, например, Russia1, Russia2 и т.д.
                   // но это для того, если мы хотим сохранить значение (очень редко)

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


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