

ネットを通してJavaのオブジェクトのソートについて勉強中です。  
下記のコードは性別、年齢、名前の順に昇順に並び替えているのですが性別におけるソートの理屈がよく分かりません。なぜ性別「m」の要素が先頭に入るリストになるのか。compareToメソッドで1が返ってくる場合は、昇順になるという意味があったりするのでしょうか。

[code]

    public class SmartEnergy {
    
        public static void main(String[] args) {
            List<Student> students = new ArrayList<>();
            students.add(new Student("いのうえなおみ", 24, 'f', 158));
            students.add(new Student("たかはしたつや", 23, 'm', 176));
            students.add(new Student("いのうえなおみ", 27, 'm', 164));
            students.add(new Student("えのもとめぐみ", 24, 'f', 162));
            students.add(new Student("えのもとたすく", 24, 'm', 178));
            students.add(new Student("さくらぎたかはる", 26, 'f', 163));
    
            //性別、年齢、名前の順に昇順に並び替える
            Collections.sort(students, new Comparator<Student>() {
                public int compare(Student student1, Student student2) {
                    int temp = 0;
                    if (student1.getSex() == 'm' && student2.getSex() == 'f')
                        temp = -1;
                    if (student1.getSex() == 'f' && student2.getSex() == 'm')
                        temp = 1;
                    if (temp == 0) {
                        temp = student1.getAge() - student2.getAge();
                        if (temp == 0)
                            temp = student1.getName().compareTo(student2.getName());
                    }
                    return temp;
                }
            });
    
            for (Student student : students) {
                System.out.println(student.getName() + "," + student.getAge() + ","
                        + student.getSex() + "," + student.getHeight());
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2017-05-04T09:26:10.420
34458
2017-05-04T10:19:37.523
17348
question
java
Javaのオブジェクトのソートについて


`sort`
の第２引数で渡されている[Comparator](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Comparator.html)
の
[compare](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Comparator.html#compare-
T-T-) メソッドを使ってソートがされます。

`compare`メソッドは、何をするかというと、渡された２つのオブジェクトの順序（大小）を決定します。

>
> 順序付けのために2つの引数を比較します。最初の引数が2番目の引数より小さい場合は負の整数、両方が等しい場合は0、最初の引数が2番目の引数より大きい場合は正の整数を返します。

という果たすべきルールがあるので、

[code]

    if (student1.getSex() == 'm' && student2.getSex() == 'f')
        temp = -1;
    
[/code]

このコードの中で`temp`に`-1`を設定していることの意味は  
最初のオブジェクト`student1`の性別が`m`で２番目のオブジェクト`student2`の性別が`f`である場合  
`student1 < student2` である。  
つまり男性が小さいオブジェクトであるという意味です。  
なので、小さいオブジェクトである性別が`m`のオブジェクトが前に来ます。

[code]

    if (temp == 0) {
        temp = student1.getAge() - student2.getAge();
        if (temp == 0)
            temp = student1.getName().compareTo(student2.getName());
    
[/code]

の部分は性別が同じ場合の順序は年齢で  
年齢が同じ場合は名前で順序をつけるという意味です。  
`temp`の意味は（１がというより正の整数）既に引用した部分の意味です。  
仮に１の場合  
`student1 > student2`  
の意味になります。

`sort`はそのような２つのオブジェクトの順序の情報を利用して並び替えるということになります。


CC BY-SA 3.0
2017-05-04T10:05:15.870
34459
2017-05-04T10:19:37.523
2017-05-04T10:19:37.523
5044
5044
34458
answer