私はストリームからリストをソートすることに興味があります。これは私が使っているコードです:
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());
}
これは、パラメータ参照がソートされるCollections.sort()
とは異なります。この場合、ソートされたストリームを取得し、それを収集して最終的に別の変数に割り当てる必要があります。
List result = list.stream().sorted((o1, o2)->o1.getItem().getValue().
compareTo(o2.getItem().getValue())).
collect(Collectors.toList());
結果を代入するのに失敗しました
代わりに 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
がソートされたデータを返すことです。期待しています。
Java 8には、ストリームのソートを容易にするために、さまざまなユーティリティAPIメソッドが用意されています。
あなたのリストが整数(あるいはDouble、Long、Stringなど)のリストであるなら、あなたは単純にリストをJavaによって提供されたデフォルトの比較子でソートすることができます。
List<Integer> integerList = Arrays.asList(1, 4, 3, 4, 5);
オンザフライでコンパレータを作成する:
integerList.stream().sorted((i1, i2) -> i1.compareTo(i2)).forEach(System.out::println);
sorted()に引数が渡されなかった場合にJava 8によって提供されるデフォルトのコンパレータを使用:
integerList.stream().sorted().forEach(System.out::println); //Natural order
同じリストを逆の順序でソートしたい場合は、
integerList.stream()。sorted(Comparator.reverseOrder())。forEach(System.out :: println); //逆順
あなたのリストがユーザー定義オブジェクトのリストであるならば、
List<Person> personList = Arrays.asList(new Person(1000, "First", 25, 30000),
new Person(2000, "Second", 30, 45000),
new Person(3000, "Third", 35, 25000));
オンザフライでコンパレータを作成する:
personList.stream().sorted((p1, p2) -> ((Long)p1.getPersonId()).compareTo(p2.getPersonId()))
.forEach(person -> System.out.println(person.getName()));
Comparator.comparingLong()メソッドを使用します(CompareDouble()、ComparisonInt()メソッドもあります):
personList.stream().sorted(Comparator.comparingLong(Person::getPersonId)).forEach(person -> System.out.println(person.getName()));
Comparator.comparing()メソッドを使用する(提供されたgetterメソッドに基づいて比較する汎用メソッド):
personList.stream().sorted(Comparator.comparing(Person::getPersonId)).forEach(person -> System.out.println(person.getName()));
thenComparing()メソッドを使ってチェーニングすることもできます。
personList.stream().sorted(Comparator.comparing(Person::getPersonId).thenComparing(Person::getAge)).forEach(person -> System.out.println(person.getName())); //Sorting by person id and then by age.
個人クラス
public class Person {
private long personId;
private String name;
private int age;
private double salary;
public long getPersonId() {
return personId;
}
public void setPersonId(long personId) {
this.personId = personId;
}
public Person(long personId, String name, int age, double salary) {
this.personId = personId;
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
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のようにネストされたマップオブジェクトをソートするのに役立ちます。ここではItemオブジェクトの価格に基づいてソートされています。
うまくいっているようです。
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
オブジェクトに格納し、そのオブジェクトを検証していますか?