重大なミスがございました。
本当にまことにもうしわけございませんと言わざるを得ません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/01 07:34 編集
2020/07/01 08:05
2020/07/01 11:28
回答1件
0
ベストアンサー
java
1Arrays.sort(dataList, (s1, s2) -> { 2 String[] s1Parts = s1.split(','); 3 int n1 = Integer.parseInt(s1Parts[0]); 4 String[] s2Parts = s2.split(','); 5 int n2 = Integer.parseInt(s2Parts[0]); 6 return Integer.compare(n1, n2); 7});
このソートを使えばいいと思います。
追記
解説します。まずはここに使っている Arrays.sort
の signature をご覧ください。
公式ドキュメントより java.util.Arrays.sort
java
1public static <T> void sort(T[] a, 2 Comparator<? super T> c)
1つ目の引数はT[] a
であり、String[] dataList
がそれにあっています。
2つ目の引数はComparator<? super T> c
。Comparator
は interface で、「比較器」の意味です。1つ目の引数により、T
がString
に固定されています。? super T
は、T
のスーパークラスです。全体に見れば、この引数は「String
あるいはそのスーパークラスを比較できる関数」の意味です。sort
はこの関数を使って配列をソートします。
Comparator
はこのようなものです:
公式ドキュメントより java.util.Comparator<T>.compare
java
1@FunctionalInterface 2public interface Comparator<T> { 3 int compare(T o1, T o2); 4}
前言により、ここのT
も「String
あるいはそのスーパークラス」になります。
Java 8 以降、Comparator
みたいな@FunctionalInterface
を求める引数にラムダ式(lambda expression)を入れられます。ラムダ式はこの部分です:
java
1(s1, s2) -> { 2 String[] s1Parts = s1.split(','); 3 int n1 = Integer.parseInt(s1Parts[0]); 4 String[] s2Parts = s2.split(','); 5 int n2 = Integer.parseInt(s2Parts[0]); 6 return Integer.compare(n1, n2); 7}
これが実はcompare
を定義しているのです。
(s1, s2)
は引数リストで、s1
もs2
もString
です。これはComparator
よりJavaもう知っていますから、略しても大丈夫です。
->
はただの提示符で、「この後はcompare
の内容です」と提示しています。
{}
の中はcompare
の内容です。compare
の要求は、s1
がs2
と同じの場合、0を返す;s1
がs2
より大きいの場合、正の整数(ここでは1)を返す;s1
がs2
より小さいの場合、負の整数(ここでは-1)を返すことです。この要求をInteger.compare
が満たせますので、ここで使います。
長くなってしまいごめんなさい。すぐに全てを理解し難いかもしれませんが、ごゆっくりしてください。
後記
1 10 11 12 2 20 21
という並び方は「辞書式順序」 (lexicographical order) と呼ばれています。なぜなら、Stringをソートする場合はほぼアルファベット順序でソートするので:
a ab abc ac b ba bb
みたいなので、そのまま数字に伸びてしまいました。一方、
1 2 3 5 11 13 22
というのは「自然順」 (natural order) と呼ばれています。バーション数字をソートするのにもよく使われてますので、「バーションソート」 (version sort) とも呼ばれています。
投稿2020/07/01 07:28
編集2020/07/01 09:14総合スコア464
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/01 07:36
2020/07/01 07:40
2020/07/01 07:49
2020/07/01 07:56 編集
2020/07/01 08:54
2020/07/01 21:49
2020/07/02 00:44
2020/07/02 01:08
2020/07/02 01:32
2020/07/02 01:37
2020/07/02 01:41
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。