Сортировка списка с stream.sorted() в Java
Я заинтересован в сортировке списка из потока. Это код, который я использую:
list.stream()
.sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue()))
.collect(Collectors.toList());
Я что-то упустил? Список не сортируется.
Он должен сортировать списки в соответствии с элементом с самым низким значением.
for (int i = 0; i < list.size(); i++)
{
System.out.println("list " + (i+1));
print(list, i);
}
И метод печати:
public static void print(List<List> list, int i)
{
System.out.println(list.get(i).getItem().getValue());
}
Ответы
Ответ 1
Это не похоже на Collections.sort()
, где сортировка параметра сортируется. В этом случае вы просто получите отсортированный поток, который вам нужно собрать и назначить другой переменной:
List result = list.stream().sorted((o1, o2)->o1.getItem().getValue().
compareTo(o2.getItem().getValue())).
collect(Collectors.toList());
Вы просто пропустили присвоение результата
Ответ 2
Используйте list.sort
вместо:
list.sort((o1, o2) -> o1.getItem().getValue().compareTo(o2.getItem().getValue()));
и сделать его более сжатым, используя Comparator.comparing
:
list.sort(Comparator.comparing(o -> o.getItem().getValue()));
После любого из них сам сортируется list
.
Ваша проблема в том, что
list.stream.sorted
возвращает отсортированные данные, он не сортируется, как вы ожидаете.
Ответ 3
Кажется, что он работает нормально:
List<BigDecimal> list = Arrays.asList(new BigDecimal("24.455"), new BigDecimal("23.455"), new BigDecimal("28.455"), new BigDecimal("20.455"));
System.out.println("Unsorted list: " + list);
final List<BigDecimal> sortedList = list.stream().sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.toList());
System.out.println("Sorted list: " + sortedList);
Пример ввода/вывода
Unsorted list: [24.455, 23.455, 28.455, 20.455]
Sorted list: [20.455, 23.455, 24.455, 28.455]
Вы уверены, что не проверяете список вместо sortedList
[в приведенном выше примере], т.е. вы сохраняете результат stream()
в новом объекте List
и проверяете этот объект?
Ответ 4
Collection<Map<Item, Integer>> itemCollection = basket.values();
Iterator<Map<Item, Integer>> itemIterator = itemCollection.stream().sorted(new TestComparator()).collect(Collectors.toList()).iterator();
package com.ie.util;
import com.ie.item.Item;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestComparator implements Comparator<Map<Item, Integer>> {
// comparator is used to sort the Items based on the price
@Override
public int compare(Map<Item, Integer> o1, Map<Item, Integer> o2) {
// System.out.println("*** compare method will be called *****");
Item item1 = null;
Item item2 = null;
Set<Item> itemSet1 = o1.keySet();
Iterator<Item> itemIterator1 = itemSet1.iterator();
if(itemIterator1.hasNext()){
item1 = itemIterator1.next();
}
Set<Item> itemSet2 = o2.keySet();
Iterator<Item> itemIterator2 = itemSet2.iterator();
if(itemIterator2.hasNext()){
item2 = itemIterator2.next();
}
return -item1.getPrice().compareTo(item2.getPrice());
}
}
**** это полезно для сортировки вложенных объектов карты, таких как Map > here i, отсортированных по цене объекта Item.