前提・実現したいこと
Listインターフェースのsortメソッドを使って数字の配列を逆転させる実装を作ろうとしたところ
実装自体はできたのですが、sortメソッドの挙動が読めずにいます。
該当のソースコード
Java
1public class Main { 2 public static void main(String[] args) { 3 List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); 4 list.sort( 5 new Comparator<Integer>() { 6 public int compare(Integer a, Integer b) { 7 System.out.println(a + "," + b); 8 return -a.compareTo(b); 9 } 10 }); 11 } 12}
※ 見やすくするために匿名クラスで書いています!
### 出力結果
System.out.println(a + "," + b);
にて出力される値を確認すると、下記のように表示されます
2,1 3,2 4,3 5,4 6,5 7,6 8,7 9,8 10,9
2,1という数値を IntegerクラスのcompareToメソッドで比較すると 2 > 1 となるので、 -1が返されますが
sortメソッドには、-a.compareTo(b);
と負の符号で返しているので、1 が返されて
第二引数の順番を前にする(逆転する)ので
{10,9,8,7,6,5,4,3,2,1}
と並べ替えられる流れです。
疑問点
Listインターフェースのsortメソッドにおける並び替えロジックは引数でComparatorインターフェースを実現して行いますが
該当コードでは、{1,2,3,4,5,6,7,8,9,10}
という配列を並び替え対象として渡しており、
compareメソッドでは下記のような順番で引数に値が渡されるものだと思いましたが、実際は逆転して渡されているようです。
1,2 3,4 5,6...
Javaドキュメントにはそのような記述は特になく、sortメソッドの実装を見てもピンとこなかったため、この挙動はsortメソッドの仕様という理解で合っているのかを伺いたいです!
以下追記です
比較する二つの数のうち、数列の前にあるほうが b になり、後にあるほうが a になってしまうのはなぜか?という質問になります!
補足
Javaのバージョンは openjdk 11.0.6 を使用しております!
それぞれのメソッドの公式ドキュメントは下記のに貼っておきます!
sortメソッド(Listインターフェース)
compareメソッド(Comparatorインターフェース)
compareToメソッド(Integerクラス)
よろしくお願い致します!
回答3件
あなたの回答
tips
プレビュー