回答編集履歴

3

後記を追加

2020/07/01 09:14

投稿

YufanLou
YufanLou

スコア464

test CHANGED
@@ -19,6 +19,10 @@
19
19
 
20
20
 
21
21
  このソートを使えばいいと思います。
22
+
23
+
24
+
25
+ ## 追記
22
26
 
23
27
 
24
28
 
@@ -113,3 +117,79 @@
113
117
 
114
118
 
115
119
  長くなってしまいごめんなさい。すぐに全てを理解し難いかもしれませんが、ごゆっくりしてください。
120
+
121
+
122
+
123
+ ## 後記
124
+
125
+
126
+
127
+ ```
128
+
129
+ 1
130
+
131
+ 10
132
+
133
+ 11
134
+
135
+ 12
136
+
137
+ 2
138
+
139
+ 20
140
+
141
+ 21
142
+
143
+ ```
144
+
145
+
146
+
147
+ という並び方は「辞書式順序」 (lexicographical order) と呼ばれています。なぜなら、Stringをソートする場合はほぼアルファベット順序でソートするので:
148
+
149
+
150
+
151
+ ```
152
+
153
+ a
154
+
155
+ ab
156
+
157
+ abc
158
+
159
+ ac
160
+
161
+ b
162
+
163
+ ba
164
+
165
+ bb
166
+
167
+ ```
168
+
169
+
170
+
171
+ みたいなので、そのまま数字に伸びてしまいました。一方、
172
+
173
+
174
+
175
+ ```
176
+
177
+ 1
178
+
179
+ 2
180
+
181
+ 3
182
+
183
+ 5
184
+
185
+ 11
186
+
187
+ 13
188
+
189
+ 22
190
+
191
+ ```
192
+
193
+
194
+
195
+ というのは「自然順」 (natural order) と呼ばれています。バーション数字をソートするのにもよく使われてますので、「バーションソート」 (version sort) とも呼ばれています。

2

文法fix

2020/07/01 09:14

投稿

YufanLou
YufanLou

スコア464

test CHANGED
@@ -104,7 +104,7 @@
104
104
 
105
105
 
106
106
 
107
- `->` はただの提示符で、この後は`compare`の内容提示します。
107
+ `->` はただの提示符で、この後は`compare`の内容です」と提示しています。
108
108
 
109
109
 
110
110
 

1

説明に詳しく加筆

2020/07/01 08:57

投稿

YufanLou
YufanLou

スコア464

test CHANGED
@@ -19,3 +19,97 @@
19
19
 
20
20
 
21
21
  このソートを使えばいいと思います。
22
+
23
+
24
+
25
+ 解説します。まずはここに使っている `Arrays.sort` の signature をご覧ください。
26
+
27
+
28
+
29
+ 公式ドキュメントより [java.util.Arrays.sort](https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-T:A-java.util.Comparator-)
30
+
31
+
32
+
33
+ ```java
34
+
35
+ public static <T> void sort(T[] a,
36
+
37
+ Comparator<? super T> c)
38
+
39
+ ```
40
+
41
+
42
+
43
+ 1つ目の引数は`T[] a`であり、`String[] dataList`がそれにあっています。
44
+
45
+
46
+
47
+ 2つ目の引数は`Comparator<? super T> c`。`Comparator` は interface で、「比較器」の意味です。1つ目の引数により、`T`が`String`に固定されています。`? super T`は、`T`のスーパークラスです。全体に見れば、この引数は「`String`あるいはそのスーパークラスを比較できる関数」の意味です。`sort`はこの関数を使って配列をソートします。
48
+
49
+
50
+
51
+ `Comparator`はこのようなものです:
52
+
53
+
54
+
55
+ 公式ドキュメントより [java.util.Comparator<T>.compare](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#compare-T-T-)
56
+
57
+ ```java
58
+
59
+ @FunctionalInterface
60
+
61
+ public interface Comparator<T> {
62
+
63
+ int compare(T o1, T o2);
64
+
65
+ }
66
+
67
+ ```
68
+
69
+
70
+
71
+ 前言により、ここの`T`も「`String`あるいはそのスーパークラス」になります。
72
+
73
+
74
+
75
+ Java 8 以降、`Comparator`みたいな`@FunctionalInterface`を求める引数にラムダ式(lambda expression)を入れられます。ラムダ式はこの部分です:
76
+
77
+
78
+
79
+ ```java
80
+
81
+ (s1, s2) -> {
82
+
83
+ String[] s1Parts = s1.split(',');
84
+
85
+ int n1 = Integer.parseInt(s1Parts[0]);
86
+
87
+ String[] s2Parts = s2.split(',');
88
+
89
+ int n2 = Integer.parseInt(s2Parts[0]);
90
+
91
+ return Integer.compare(n1, n2);
92
+
93
+ }
94
+
95
+ ```
96
+
97
+
98
+
99
+ これが実は`compare`を定義しているのです。
100
+
101
+
102
+
103
+ `(s1, s2)` は引数リストで、`s1`も`s2`も`String`です。これは`Comparator`よりJavaもう知っていますから、略しても大丈夫です。
104
+
105
+
106
+
107
+ `->` はただの提示符で、この後は`compare`の内容を提示します。
108
+
109
+
110
+
111
+ `{}` の中は`compare`の内容です。`compare`の要求は、`s1`が`s2`と同じの場合、0を返す;`s1`が`s2`より大きいの場合、正の整数(ここでは1)を返す;`s1`が`s2`より小さいの場合、負の整数(ここでは-1)を返すことです。この要求を`Integer.compare`が満たせますので、ここで使います。
112
+
113
+
114
+
115
+ 長くなってしまいごめんなさい。すぐに全てを理解し難いかもしれませんが、ごゆっくりしてください。