重大なミスがございました。
本当にまことにもうしわけございませんと言わざるを得ません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
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総合スコア466
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。