質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

514閲覧

複数の項目がある配列のある場所を参照してソートしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/08/03 12:09

編集2022/08/04 04:00

前提

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

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

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

実現したいこと

【田中優、男、会社員、26】
【遠藤仁美、女性、高校生、15】
【加藤博史、男性、自営業、44】

という例をソートして

【遠藤仁美、女性、高校生、15】
【田中優、男、会社員、26】
【加藤博史、男性、自営業、44】

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

該当のソースコード

Java

1class HumanData{ 2 private String name; 3 private String sex; 4 private String profession; 5 int age; 6 7 public void setFields(String n, String s, String p, int a) { 8 name = n; 9 sex = s; 10 profession = p; 11 age = a; 12 } 13 14 public String getName() { 15 return name; 16 } 17 18 public String getSex() { 19 return sex; 20 } 21 22 public String Profession() { 23 return profession; 24 } 25 26 public int getAge() { 27 return age; 28 } 29 30 public void show() { 31 System.out.println("氏名:" + name + "、性別:" + sex + "、職業:" + profession + "、年:" + age + ""); 32 } 33 34} 35 36 37public class Data { 38 39 public static void main(String[] args) throws IOException { 40 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 41 HumanData[] data = new HumanData[2]; 42 43 for(int i = 0; i< data.length; i++) { 44 System.out.println("データを入力してください"); 45 String H_name = br.readLine(); 46 String H_sex = br.readLine(); 47 String H_profession = br.readLine(); 48 String H_age = br.readLine(); 49 int ag = Integer.parseInt(H_age); 50 data[i] = new HumanData(); 51 data[i].setFields(H_name, H_sex, H_profession, ag); 52 } 53 for(int i = 0; i< data.length; i++) { 54 data[i].show(); 55 } 56 } 57} 58 59

試したこと

多次元配列なのか、など色々調べてみましたがどうやって実装したらよいのか分かりませんでした。
思ったのは何らかの配列Xに【氏名、性別、職業、年齢】を格納し、Xの4番目を参照してソートするなどの方法はどうなのかとは思っているのですがどうやったらいいのか分からないので、ご意見お伺いしたいです。

追記:様々なソートのやり方を試してみたのですが、自分のやり方が違うのか上手く出来ませんでした。
なにかこの場合の方法をご教授いただければと思います

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/08/03 12:27

>1つの配列のデータのみの値でしたらソート出来る ということですが、参考までにそのコードもご提示していただけますでしょうか。
kazuma-s

2022/08/03 17:58

> 年齢部分の値を使ってソートしたいと考えています。 String age; でいいんですか? "100" は "99" より小さい。"10" は "9" より小さい。 また、int a で age = a; はエラーになります。 データは ArrayList<HumanData> ではなく、配列の HumanData[] で持ちたいのですか?
dodox86

2022/08/04 02:13

> 1つの配列のデータのみの値でしたらソート出来るのですが、このように複数の配列があるデータを複数用いてソートするというのが分かりません。 用語の理解に誤りがあるのか勘違いされているのか分かりませんが、複数の配列があるデータと言う訳ではないはずです。HumanDataクラスのオブジェクトを要素とする1次元の配列で、その内、「年齢」の項目に関してソートの比較対象とするだけです。多次元配列である必要はありません。
dodox86

2022/08/04 04:11

えっと、プロフィール欄を拝見したのですが、 > fuku_beginnerのサブアカウントになります > 外にいるときはメールアドレスの問題でこちらをメインで使ってます。 悪気は無かったと思いたいですが、複数のアカウントは利用規約違反です。 https://teratail.com/legal > 第7条(禁止事項) > 複数のユーザーIDを1人で保有する行為
guest

回答2

0

テキトウに探して出てきたモノです。
ArrayList 要素のソートと Comparator

投稿2022/08/03 13:30

jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/08/04 04:05

ありがとうございます。 こちらも今後の参考にしていきたいと思います。
dodox86

2022/08/04 18:04 編集

[ここでのコメント投稿は不適切だったので削除]
guest

0

ベストアンサー

MusicData[] data = new HumanData[2]; ですが、
MusicData ではなくて、HumanData ですよね。
コンパイルしてエラーが無いことを確認していないのですか?

しかし1つの配列のデータのみの値でしたらソート出来るのですが、

それなら、そのコードを質問に追記してほしいのです。
現在の質問のコードは配列への入力と、その配列の表示しかなくて、
ソートをどのように行うつもりなのかが回答者にはわかりません。
Arrays.sort を使うのか。
それとも、自前で選択ソートやバブルソートなどを実装するのか。

Arrays.sort を使っているのなら、ソートは 1行です。

Java

1import java.io.*; // IOException, InputStreamReader, BufferedReader 2import java.util.Arrays; 3 4class HumanData { 5 private String name; 6 private String sex; 7 private String profession; 8 private int age; 9 10 public void setFields(String n, String s, String p, int a) { 11 name = n; 12 sex = s; 13 profession = p; 14 age = a; 15 } 16 17 public int getAge() { return age; } 18 19 public void show() { 20 System.out.println("氏名:" + name + "、性別:" + sex + "、職業:" + profession + "、年:" + age + ""); 21 } 22 23} 24 25public class Data { 26 public static void main(String[] args) throws IOException { 27 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 28 HumanData[] data = new HumanData[2]; 29 30 for (int i = 0; i < data.length; i++) { 31 System.out.println("データを入力してください"); 32 String H_name = br.readLine(); 33 String H_sex = br.readLine(); 34 String H_profession = br.readLine(); 35 String H_age = br.readLine(); 36 int ag = Integer.parseInt(H_age); 37 data[i] = new HumanData(); 38 data[i].setFields(H_name, H_sex, H_profession, ag); 39 } 40 Arrays.sort(data, (a, b) -> a.getAge() - b.getAge()); // ★ 41 for (int i = 0; i < data.length; i++) data[i].show(); 42 } 43}

(a, b) -> a.getAge() - b.getAge() はラムダ式です。
ラムダ式がが分からないのなら、次のようにも書けます。

Java

1 class CompareAge implements Comparator<HumanData> { 2 public int compare(HumanData a, HumanData b) { 3 return a.getAge() - b.getAge(); 4 } 5 } 6 Arrays.sort(data, new CompareAge());

投稿2022/08/04 03:56

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/08/04 04:05 編集

すみません、「1つの配列のデータのみの値でしたらソート出来るのですが」というのはこれまでにそういったコードを書いたことがあり、作成は可能という意味で記載しました。 大変わかりにくくてすみません。 私はArray.sortしかまだ使えるものがないのですが上手く使えなかったので、他に方法があれば知りたいという意味で質問させていただきました。 わかりにくくて本当にすみません。 以後気をつけていきたいと思います。 また詳しく複数の方法を教えていただいたため、こちらをベストアンサーにさせていただきました。 ありがとうございました。
kazuma-s

2022/08/04 04:20

> 私はArray.sortしかまだ使えるものがないのですが上手く使えなかったので、他に方法があれば知りたい それを質問に書かなければ、回答者には伝わりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問