Сортировка списка по подстрокам в java stream по двум условиям
Есть стрим в котором на каком-то этапе стринги преобразуются в Object, получается вот такой лист:
[3-B, 4-A, 4-D] (цифра\делиметер\буква). Я его привожу к стрингу и сортирую. Цифры нужно сортировать по убыванию, если цифры совпадают, то буквы - по возрастанию кодов.
Чтобы доступиться к методам сравнения я привожу object в string.Но это не дает результата. Второе условие почему-то сравнивает не последние символы (как я ожидаю), а все слово. Все действия нужно сделать с помощью одного стрима.
Что мне нужно исправить?
из [3-B, 4-A, 4-D] --нужно получить--> [ 4-A, 4-D, 3-B]
List<String>list.stream()
...
.map(Object::toString)
.sorted(Comparator.comparing(String::valueOf)
.thenComparingInt(str -> Integer.parseInt((str.toString()).substring(2)))
.reversed())
.collect(Collectors.toList());
Ответы (2 шт):
Раз обязательно Stream API - можно вот так:
List<String> list = new ArrayList<>();
list.add("3-B");
list.add("4-A");
list.add("4-D");
list = list.stream().sorted((o1, o2) -> {
int code1 = Integer.parseInt(o1.substring(0, 1));
int code2 = Integer.parseInt(o2.substring(0, 1));
if (code2 - code1 != 0) {
return code2 - code1;
} else {
char char1 = o1.charAt(2);
char char2 = o2.charAt(2);
return char1 - char2;
}
}).collect(Collectors.toList());
System.out.println(list);
Вроде бы нашел причину: компаратору нужно было явно указать типы подстрок.
.sorted (Comparator.<String, String> comparing(s -> s.split("-")[0])
.reversed()
.thenComparingInt(s -> Integer.parseInt(s.split("-")[1])))