comparing
・thenComparing
の引数keyExtractor
は、ソートキーを取り出す関数を指定します。
Comparator#comparing (Java Platform SE 8 )
Comparator#thenComparing (Java Platform SE 8 )
Map<String, String>
を受け取ってString
を返す、staticメソッドを作ってしまうのがわかりやすいかもしれません(元ネタと同じくメソッド参照にできます)
ラムダで指定もできますが、チェーンするとエラーになったりしてちょっと注意が必要です。
Comparatorで学ぶJavaのラムダ式 - Qiita
Stream処理における、型推論されない原因がわからない
わかりやすいように元ネタと同じ構造にしました。
Java
1import java.util.*;
2
3public class Stream {
4 public static void main(String[] args) {
5 var a1 = createMap("Taro", "2018-07-11", "15");
6 var a2 = createMap("Taro", "2015-11-01", "53");
7 var a3 = createMap("Taro", "2015-10-31", "54");
8
9 var a4 = createMap("Hanako", "2017-02-05", "53");
10 var a5 = createMap("Hanako", "2016-11-01", "160");
11 var a6 = createMap("Hanako", "2012-08-20", "22");
12
13 var a7 = createMap("Pochi", "2013-03-16", "38");
14 var a8 = createMap("Pochi", "2011-09-25", "200");
15 var a9 = createMap("Pochi", "2018-04-13", "10");
16
17 var list = Arrays.asList(a1, a2, a3, a4, a5, a6, a7, a8, a9);
18 list.stream().forEach(a -> System.out.println(a.get("contributor") + " " + a.get("date") + " " + a.get("goodCount")));
19
20
21 System.out.println("\n名前 -> 投稿日でソート");
22 Comparator<Map<String, String>> comparator =
23 // Stream::は、このクラスのメソッド参照(java.util.stream.Streamとは何の関係もない!)
24 Comparator.comparing(Stream::getContributor).thenComparing(Stream::getDate);
25
26 // ラムダでも書けるがthenComparingがあると、型を明示しないといけないのが少々うっとおしい
27 // [Stream処理における、型推論されない原因がわからない](https://teratail.com/questions/245767)
28 //Comparator.comparing((Map<String, String> a) -> a.get("contributor")).thenComparing(a -> a.get("date"));
29
30 list.stream().sorted(comparator)
31 .forEach(a -> System.out.println(a.get("contributor") + " " + a.get("date") + " " + a.get("goodCount")));
32
33
34 System.out.println("\n名前 -> いいね数でソート");
35 comparator = Comparator.comparing(Stream::getContributor).thenComparing(Stream::getGoodCount);
36 list.stream().sorted(comparator)
37 .forEach(a -> System.out.println(a.get("contributor") + " " + a.get("date") + " " + a.get("goodCount")));
38 }
39
40 private static Map<String, String> createMap(String contributor, String date, String goodCount) {
41 var map = new HashMap<String, String>();
42 map.put("contributor", contributor);
43 map.put("date", date);
44 map.put("goodCount", goodCount);
45 return map;
46 }
47
48 private static String getContributor(Map<String, String> map) {
49 return map.get("contributor");
50 }
51
52 private static String getDate(Map<String, String> map) {
53 return map.get("date");
54 }
55
56 private static String getGoodCount(Map<String, String> map) {
57 return map.get("goodCount");
58 }
59}
Taro 2018-07-11 15
Taro 2015-11-01 53
Taro 2015-10-31 54
Hanako 2017-02-05 53
Hanako 2016-11-01 160
Hanako 2012-08-20 22
Pochi 2013-03-16 38
Pochi 2011-09-25 200
Pochi 2018-04-13 10
名前 -> 投稿日でソート
Hanako 2012-08-20 22
Hanako 2016-11-01 160
Hanako 2017-02-05 53
Pochi 2011-09-25 200
Pochi 2013-03-16 38
Pochi 2018-04-13 10
Taro 2015-10-31 54
Taro 2015-11-01 53
Taro 2018-07-11 15
名前 -> いいね数でソート
Hanako 2016-11-01 160 ※
Hanako 2012-08-20 22
Hanako 2017-02-05 53
Pochi 2018-04-13 10
Pochi 2011-09-25 200 ※
Pochi 2013-03-16 38
Taro 2018-07-11 15
Taro 2015-11-01 53
Taro 2015-10-31 54
※ 数値ではなく文字列での比較のため元ネタと順番が違う。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/06 01:52