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

回答編集履歴

3

後記を追加

2020/07/01 09:14

投稿

YufanLou
YufanLou

スコア466

answer CHANGED
@@ -10,6 +10,8 @@
10
10
 
11
11
  このソートを使えばいいと思います。
12
12
 
13
+ ## 追記
14
+
13
15
  解説します。まずはここに使っている `Arrays.sort` の signature をご覧ください。
14
16
 
15
17
  公式ドキュメントより [java.util.Arrays.sort](https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-T:A-java.util.Comparator-)
@@ -55,4 +57,42 @@
55
57
 
56
58
  `{}` の中は`compare`の内容です。`compare`の要求は、`s1`が`s2`と同じの場合、0を返す;`s1`が`s2`より大きいの場合、正の整数(ここでは1)を返す;`s1`が`s2`より小さいの場合、負の整数(ここでは-1)を返すことです。この要求を`Integer.compare`が満たせますので、ここで使います。
57
59
 
58
- 長くなってしまいごめんなさい。すぐに全てを理解し難いかもしれませんが、ごゆっくりしてください。
60
+ 長くなってしまいごめんなさい。すぐに全てを理解し難いかもしれませんが、ごゆっくりしてください。
61
+
62
+ ## 後記
63
+
64
+ ```
65
+ 1
66
+ 10
67
+ 11
68
+ 12
69
+ 2
70
+ 20
71
+ 21
72
+ ```
73
+
74
+ という並び方は「辞書式順序」 (lexicographical order) と呼ばれています。なぜなら、Stringをソートする場合はほぼアルファベット順序でソートするので:
75
+
76
+ ```
77
+ a
78
+ ab
79
+ abc
80
+ ac
81
+ b
82
+ ba
83
+ bb
84
+ ```
85
+
86
+ みたいなので、そのまま数字に伸びてしまいました。一方、
87
+
88
+ ```
89
+ 1
90
+ 2
91
+ 3
92
+ 5
93
+ 11
94
+ 13
95
+ 22
96
+ ```
97
+
98
+ というのは「自然順」 (natural order) と呼ばれています。バーション数字をソートするのにもよく使われてますので、「バーションソート」 (version sort) とも呼ばれています。

2

文法fix

2020/07/01 09:14

投稿

YufanLou
YufanLou

スコア466

answer CHANGED
@@ -51,7 +51,7 @@
51
51
 
52
52
  `(s1, s2)` は引数リストで、`s1`も`s2`も`String`です。これは`Comparator`よりJavaもう知っていますから、略しても大丈夫です。
53
53
 
54
- `->` はただの提示符で、この後は`compare`の内容提示します。
54
+ `->` はただの提示符で、この後は`compare`の内容です」と提示しています。
55
55
 
56
56
  `{}` の中は`compare`の内容です。`compare`の要求は、`s1`が`s2`と同じの場合、0を返す;`s1`が`s2`より大きいの場合、正の整数(ここでは1)を返す;`s1`が`s2`より小さいの場合、負の整数(ここでは-1)を返すことです。この要求を`Integer.compare`が満たせますので、ここで使います。
57
57
 

1

説明に詳しく加筆

2020/07/01 08:57

投稿

YufanLou
YufanLou

スコア466

answer CHANGED
@@ -8,4 +8,51 @@
8
8
  });
9
9
  ```
10
10
 
11
- このソートを使えばいいと思います。
11
+ このソートを使えばいいと思います。
12
+
13
+ 解説します。まずはここに使っている `Arrays.sort` の signature をご覧ください。
14
+
15
+ 公式ドキュメントより [java.util.Arrays.sort](https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-T:A-java.util.Comparator-)
16
+
17
+ ```java
18
+ public static <T> void sort(T[] a,
19
+ Comparator<? super T> c)
20
+ ```
21
+
22
+ 1つ目の引数は`T[] a`であり、`String[] dataList`がそれにあっています。
23
+
24
+ 2つ目の引数は`Comparator<? super T> c`。`Comparator` は interface で、「比較器」の意味です。1つ目の引数により、`T`が`String`に固定されています。`? super T`は、`T`のスーパークラスです。全体に見れば、この引数は「`String`あるいはそのスーパークラスを比較できる関数」の意味です。`sort`はこの関数を使って配列をソートします。
25
+
26
+ `Comparator`はこのようなものです:
27
+
28
+ 公式ドキュメントより [java.util.Comparator<T>.compare](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#compare-T-T-)
29
+ ```java
30
+ @FunctionalInterface
31
+ public interface Comparator<T> {
32
+ int compare(T o1, T o2);
33
+ }
34
+ ```
35
+
36
+ 前言により、ここの`T`も「`String`あるいはそのスーパークラス」になります。
37
+
38
+ Java 8 以降、`Comparator`みたいな`@FunctionalInterface`を求める引数にラムダ式(lambda expression)を入れられます。ラムダ式はこの部分です:
39
+
40
+ ```java
41
+ (s1, s2) -> {
42
+ String[] s1Parts = s1.split(',');
43
+ int n1 = Integer.parseInt(s1Parts[0]);
44
+ String[] s2Parts = s2.split(',');
45
+ int n2 = Integer.parseInt(s2Parts[0]);
46
+ return Integer.compare(n1, n2);
47
+ }
48
+ ```
49
+
50
+ これが実は`compare`を定義しているのです。
51
+
52
+ `(s1, s2)` は引数リストで、`s1`も`s2`も`String`です。これは`Comparator`よりJavaもう知っていますから、略しても大丈夫です。
53
+
54
+ `->` はただの提示符で、この後は`compare`の内容を提示します。
55
+
56
+ `{}` の中は`compare`の内容です。`compare`の要求は、`s1`が`s2`と同じの場合、0を返す;`s1`が`s2`より大きいの場合、正の整数(ここでは1)を返す;`s1`が`s2`より小さいの場合、負の整数(ここでは-1)を返すことです。この要求を`Integer.compare`が満たせますので、ここで使います。
57
+
58
+ 長くなってしまいごめんなさい。すぐに全てを理解し難いかもしれませんが、ごゆっくりしてください。