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

Ругается на несоответствие типов Integer и String в ключе:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Map<Integer, String> treeMap02 = Stream
                .of("4a", "3b", "1d", "2c")
                .collect(Collectors
                        .toMap(
                                p -> p.substring(0, 1), 
                                p -> p.substring(1, 2), 
                                (e1, e2) -> e2, 
                                TreeMap::new));


Подскажите, пожалуйста, как правильно привести в данном примере String к Integer?

Сортировка будет по умолчанию выполнена по ключу.
Как в этом стриме можно реализовать сортировку по значению?

Спасибо.
...
Рейтинг: 0 / 0
Преобразование Array в Map используя Stream. Приведение типов
    #39566417
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

Integer.parseInt(p.substring(0,1))
...
Рейтинг: 0 / 0
Преобразование Array в Map используя Stream. Приведение типов
    #39566430
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Map<Integer, String> treeMap02 = Stream
                .of("4a", "3b", "1d", "2c")
                .collect(Collectors
                        .toMap(
                                p -> p.substring(0, 1), 
                                p -> p.substring(1, 2), 
                                (e1, e2) -> e2, 
                                TreeMap::new));



Я бы рекомендовал минимизировать использование лямбд и свести их к более читаемым методам:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Map<Integer, String> treeMap02 = Stream
                .of("4a", "3b", "1d", "2c")
                .collect(Collectors
                        .toMap(
                                this::extractKey, 
                                this::extractValue, 
                                (e1, e2) -> e2, 
                                TreeMap::new));



MolasarПодскажите, пожалуйста, как правильно привести в данном примере String к Integer?

А как вы "приводите" в других примерах? Просто String от к Integer, как бы, не приводится. Это не совместимые типы.

MolasarСортировка будет по умолчанию выполнена по ключу.

Даже без умолчания, так устроена TreeMap.

MolasarКак в этом стриме можно реализовать сортировку по значению?

https://stackoverflow.com/a/27114816
...
Рейтинг: 0 / 0
Преобразование Array в Map используя Stream. Приведение типов
    #39567038
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingMolasar,

Integer.parseInt(p.substring(0,1))

Спасибо!
...
Рейтинг: 0 / 0
Преобразование Array в Map используя Stream. Приведение типов
    #39568699
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Как сортировать TreeSet через Comparator я понял.

Но если в моем первом сложном стриме поменять Treeset на LinkedHashMap, то как можно отсортировать новую коллекцию LinkedHashMap по ключу в порядке убывания?

В более простых стримах я делал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Map<String, Integer> priceHM = new HashMap<>();
        
        priceHM.put("Iphone 8", 45000);
        priceHM.put("SamSumg 7", 40000);
        priceHM.put("Xiaomi Mi5S", 25000);
        priceHM.put("Honor", 35000);

        Map<String, Integer> sortedUsingLHM = priceHM.entrySet()
                .stream()
                .sorted(Map.Entry.<String, Integer> comparingByKey().reversed()) // куда вставить sorted в первый сложный стрим?
                .collect(Collectors.toMap(
                        Map.Entry::getKey, 
                        Map.Entry::getValue, 
                        (e1, e2) -> e2, LinkedHashMap::new));
        System.out.println("Sorted sortedUsingLHM: " + sortedUsingLHM);
...
Рейтинг: 0 / 0
Преобразование Array в Map используя Stream. Приведение типов
    #39571168
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarBlazkowicz,

Как сортировать TreeSet через Comparator я понял.

Но если в моем первом сложном стриме поменять Treeset на LinkedHashMap, то как можно отсортировать новую коллекцию LinkedHashMap по ключу в порядке убывания?

В более простых стримах я делал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Map<String, Integer> priceHM = new HashMap<>();
        
        priceHM.put("Iphone 8", 45000);
        priceHM.put("SamSumg 7", 40000);
        priceHM.put("Xiaomi Mi5S", 25000);
        priceHM.put("Honor", 35000);

        Map<String, Integer> sortedUsingLHM = priceHM.entrySet()
                .stream()
                .sorted(Map.Entry.<String, Integer> comparingByKey().reversed()) // куда вставить sorted в первый сложный стрим?
                .collect(Collectors.toMap(
                        Map.Entry::getKey, 
                        Map.Entry::getValue, 
                        (e1, e2) -> e2, LinkedHashMap::new));
        System.out.println("Sorted sortedUsingLHM: " + sortedUsingLHM);




Сортировка по значению

https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java

Вам точно нужны стримы ?
...
Рейтинг: 0 / 0
Преобразование Array в Map используя Stream. Приведение типов
    #39571347
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarНо если в моем первом сложном стриме поменять Treeset на LinkedHashMap, то как можно отсортировать новую коллекцию 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.
Map<Integer, String> 
    treeMap02 = 
        Stream
            .of("4a", "3b", "1d", "2c")
            .collect(
                Collectors
                    .toMap(
                        p -> Integer.valueOf(p.substring(0, 1)), 
                        p -> p.substring(1, 2), 
                        (u, v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); },
                        TreeMap::new))
            .entrySet()
            .stream()
            .sorted(Map.Entry.<Integer, String>comparingByKey().reversed())
            .collect(
                Collectors
                    .toMap(
                        Map.Entry::getKey, 
                        Map.Entry::getValue,
                        (u, v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); },
                        LinkedHashMap::new));

System.out.println(treeMap02);
...
Рейтинг: 0 / 0
Преобразование Array в Map используя Stream. Приведение типов
    #39571353
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или лучше так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Map<Integer, String> 
    treeMap02 = 
        Stream
            .of("4a", "3b", "1d", "2c")
            .collect(
                Collectors
                    .toMap(
                        p -> Integer.valueOf(p.substring(0, 1)), 
                        p -> p.substring(1, 2), 
                        (u, v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); },
                        () -> new LinkedHashMap<>(new TreeMap<>((a, b) -> b.compareTo(a)))));

System.out.println(treeMap02.getClass());
System.out.println(treeMap02);
...
Рейтинг: 0 / 0
Преобразование Array в Map используя Stream. Приведение типов
    #39571393
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все же придется убрать LinkedHashMap и оставить TreeMap:
Usman
Код: java
1.
() -> new LinkedHashMap<>(new TreeMap<>((a, b) -> b.compareTo(a)))));

а преобразование выполнить позже:
Код: java
1.
2.
treeMap02 = new LinkedHashMap<>(treeMap02);
System.out.println(treeMap02);
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразование Array в Map используя Stream. Приведение типов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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