90375


私はJava初心者です。  
現在いくつかの問題を解いてるのですが、ある問題で詰まってしまいました。  
そこで有識者の方々に意見をお伺いしたいと思い、質問させていただきました。

今回、クラスを用いて入力した値を参照してデータを昇順にソートしたいと考えています。  
データとしては【氏名、性別、職業、年齢】といったデータを５個入力し、年齢部分の値を使ってソートしたいと考えています。  
しかし１つの配列のデータのみの値でしたらソート出来るのですが、このように複数の配列があるデータを複数用いてソートするというのが分かりません。

考えたり、調べてもやり方が浮かばなかったので意見を貰えると幸いです。

【田中優、男、会社員、２６】  
【遠藤仁美、女性、高校生、１５】  
【加藤博史、男性、自営業、４４】

という例をソートして

【遠藤仁美、女性、高校生、１５】  
【田中優、男、会社員、２６】  
【加藤博史、男性、自営業、４４】

というように年齢を参照してソートしたいです。

この場合、年齢部分を参照してソートはどうやって出来るのでしょうか？  
色々なソートを試したのですが、どうしても上手くいきませんでした。

[code]

       class HumanData{
        private String name;
        private String sex;
        private String profession;
        int age;
        
        public void setFields(String n, String s, String p, int a) {
            name = n;
            sex = s;
            profession = p;
            age = a;
        }
        
        public String getName() {
            return name;
        }
        
        public String getSex() {
            return sex;
        }
        
        public String Profession() {
            return profession;
        }
        
        public int getAge() {
            return age;
        }
        
        public void show() {
            System.out.println("氏名：" + name + "、性別:" + sex + "、職業:" + profession + "、年:" + age + "");
        }
    
    }
    
    
    public class Data {
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            MusicData[] data = new HumanData[2];
            
            for(int i = 0; i< data.length; i++) {
                System.out.println("データを入力してください");
                String H_name = br.readLine();
                String H_sex = br.readLine();
                String H_profession = br.readLine();
                String H_age = br.readLine();
                int ag = Integer.parseInt(H_age);
                data[i] = new HumanData();
                data[i].setFields(H_name, H_sex, H_profession, ag);
            }
            for(int i = 0; i< data.length; i++) {
                data[i].show();
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2022-08-04T00:03:13.513
90371
2022-08-04T02:43:52.067
53834
question
java array sort
複数の要素がある配列の特定の値を参照してソート


簡単なソート方法として、[`Arrays.sort`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Arrays.html#sort\(T%5B%5D,java.util.Comparator\))と[`Comparator.comparingInt`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Comparator.html#comparingInt\(java.util.function.ToIntFunction\))を組み合わせて特定メソッドの戻り値でソート可能です。

**サンプルコード** (HumanDataは変更していないため省略)

[code]

    import java.util.Arrays;
    import java.util.Comparator;
    
    public class Data {
    
        public static void main(String[] args) {
            HumanData[] data = new HumanData[3];
            for(int i = 0; i < data.length; i++) {data[i] = new HumanData();}  // 配列を初期化
    
            data[0].setFields("田中優","男","会社員",26);
            data[1].setFields("遠藤仁美","女","高校生",15);
            data[2].setFields("加藤博史","男","自営業",44);
    
            // ソート
            Arrays.sort(data, Comparator.comparingInt(HumanData::getAge));
    
            // 表示
            for(int i = 0; i< data.length; i++) {
                data[i].show();
            }
        }
    }
    
[/code]

**参考資料**

  * [Java8のComparatorの使い方(Collectionsクラスのsortメソッド)](https://confrage.jp/java8%E3%81%AEcomparator%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9collections%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AEsort%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89/)
  * [Sort a Java collection object based on one field in it](https://stackoverflow.com/a/12542755)


CC BY-SA 4.0
2022-08-04T02:43:52.067
90375
2022-08-04T02:43:52.067
9820
90371
answer