teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

ソースコードの不備(import)を修正

2020/04/12 09:46

投稿

xebme
xebme

スコア1109

answer CHANGED
@@ -1,10 +1,15 @@
1
1
  とりあえず。
2
2
 
3
3
  ```Java
4
+ import java.util.ArrayList;
5
+ import java.util.Arrays;
6
+ import java.util.Comparator;
4
- import java.util.*;
7
+ import java.util.List;
5
8
  import java.util.function.BiFunction;
6
9
  import java.util.function.Consumer;
10
+ import java.util.function.Function;
7
11
  import java.util.stream.Collectors;
12
+ import java.util.stream.IntStream;
8
13
 
9
14
  public class Sorters {
10
15
 
@@ -23,6 +28,12 @@
23
28
  .findFirst()
24
29
  .orElse(0);
25
30
 
31
+ static Function<Integer,Comparator<long[]>> genComparatorChain = size ->
32
+ IntStream.range(0,size)
33
+ .mapToObj(i -> Comparator.<long[],Long>comparing(x -> x[i]))
34
+ .reduce((a,b) -> 0, Comparator::thenComparing);
35
+ static Comparator<long[]> comparator14 = genComparatorChain.apply(2);
36
+
26
37
  static BiFunction<Comparator<long[]>, long[][], long[][]> sorter =
27
38
  (comparator, array) -> Arrays.stream(array)
28
39
  .sorted(comparator)
@@ -43,7 +54,8 @@
43
54
  dump_.accept(sorter.apply(comparator3,a));
44
55
  dump_.accept(sorter.apply(comparator4,a));
45
56
  dump_.accept(sorter.apply(comparator13,a));
46
- dump_.accept(sorter.apply(comparator12,a));
57
+ dump_.accept(sorter.apply(comparator12,a));
58
+ dump_.accept(sorter.apply(comparator14,a));
47
59
  }
48
60
  }
49
61
  ```

2

配列のサイズに合わせたComparator<long[]>(追記)

2020/04/12 09:46

投稿

xebme
xebme

スコア1109

answer CHANGED
@@ -64,4 +64,17 @@
64
64
  // 3
65
65
  Function<Integer,Function<long[],Long>> getElement = i -> (array) -> array[i];
66
66
  Comparator<long[]> comparator13 = Comparator.comparing(getElement.apply(0)).thenComparing(getElement.apply(1));
67
- ```
67
+ ```
68
+ ###
69
+ **配列のサイズに合わせたComparator<long[]>(追記)**
70
+
71
+ 結論の3番目を変形して、配列のサイズに応じた`Comparator<long[]>`が作れることがわかりました。
72
+
73
+ ```Java
74
+ Function<Integer,Comparator<long[]>> genComparatorChain = size ->
75
+ IntStream.range(0,size)
76
+ .mapToObj(i -> Comparator.<long[],Long>comparing(x -> x[i]))
77
+ .reduce((a,b) -> 0, Comparator::thenComparing);
78
+ Comparator<long[]> comparator14 = genComparatorChain.apply(2);
79
+ ```
80
+ 結論:Comparatorに限らず、Functionインターフェイスでもreduce()を使って、compose()、andThen()をチェインできることがわかり有益でした。

1

結論(追記)

2020/04/12 09:20

投稿

xebme
xebme

スコア1109

answer CHANGED
@@ -13,6 +13,16 @@
13
13
  static Comparator<long[]> comparator3 = Comparator.<long[], Long>comparing(v -> v[0]).thenComparing(v -> v[1]);
14
14
  static Comparator<long[]> comparator4 = Comparator.<long[], Long>comparing(v -> v[0]).thenComparingLong(v -> v[1]);
15
15
 
16
+ static Function<Integer,Function<long[],Long>> getElement = i -> (array) -> array[i];
17
+ static Comparator<long[]> comparator13 = Comparator.comparing(getElement.apply(0)).thenComparing(getElement.apply(1));
18
+
19
+ static Comparator<long[]> comparator12 = (x,y) ->
20
+ IntStream.range(0, Math.min(x.length,y.length))
21
+ .map(i -> Long.compare(x[i], y[i]))
22
+ .dropWhile(i -> i == 0)
23
+ .findFirst()
24
+ .orElse(0);
25
+
16
26
  static BiFunction<Comparator<long[]>, long[][], long[][]> sorter =
17
27
  (comparator, array) -> Arrays.stream(array)
18
28
  .sorted(comparator)
@@ -31,7 +41,27 @@
31
41
  dump_.accept(sorter.apply(comparator1,a));
32
42
  dump_.accept(sorter.apply(comparator2,a));
33
43
  dump_.accept(sorter.apply(comparator3,a));
34
- dump_.accept(sorter.apply(comparator4,a));
44
+ dump_.accept(sorter.apply(comparator4,a));
45
+ dump_.accept(sorter.apply(comparator13,a));
46
+ dump_.accept(sorter.apply(comparator12,a));
35
47
  }
36
48
  }
49
+ ```
50
+ ###
51
+ **結論(追記)**
52
+
53
+ `thenComparing`のkyExtractorの型が推論されない問題の解決として、以下の3つの方法がありました。
54
+
55
+ - Comparator.comparingに指定するラムダ式の、引数に型`long[]`を指定する
56
+ - staticメソッドComparator.comparingにkeyExtractorの型`<long[], Long>`を指定する
57
+ - あらかじめkeyExtractor関数`Function<long[],Long>`を定義しておき渡す。
58
+
59
+ ```Java
60
+ // 1
61
+ Comparator.comparing((long[] v) -> v[0]).thenComparing(v -> v[1]);
62
+ // 2
63
+ Comparator.<long[], Long>comparing(v -> v[0]).thenComparing(v -> v[1]);
64
+ // 3
65
+ Function<Integer,Function<long[],Long>> getElement = i -> (array) -> array[i];
66
+ Comparator<long[]> comparator13 = Comparator.comparing(getElement.apply(0)).thenComparing(getElement.apply(1));
37
67
  ```