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

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

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

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

Q&A

解決済

4回答

761閲覧

java アルファベット順に並び替え

JAVA-B1

総合スコア4

Java

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

0グッド

0クリップ

投稿2023/05/26 04:09

編集2023/06/02 00:17

実現したいこと

senbatsuの名前列(第0列)の内容をアルファベット順になるように並び替えをしたい

前提

・senbatsuの情報を並び替える
・アルファベット順になるようにする

発生している問題・エラーメッセージ

・みな様からのアドバイスをもとにプログラムを修正したのですが、
”name”の列をアルファベット順にソートすることができません。

該当のソースコード

Java

1class Quiz9A { 2 public static void main(String[] args) { 3 String[][] senbatsu = { 4 {"Name","BloodType","Year","Month","Day","HomeTown"}, 5 {"A","O","1992","11","21","Oita"}, 6 {"B","B","1991","7","15","Kagoshima"}, 7 {"C","AB","1994","3","26","Saitama"}, 8 {"D","AB","1991","4","8","Tokyo"}, 9 {"E","B","1997","3","8","Aichi"}, 10 {"F","B","1993","7","14","Osaka"}, 11 {"G","A","1998","3","19","Kagoshima"}, 12 {"H","O","1990","8","13","Tokyo"}, 13 {"I","A","1994","3","30","Saitama"}, 14 {"J","B","1992","12","8","Kyoto"}, 15 {"K","A","1991","6","24","Aichi"}, 16 {"L","B","1993","9","19","Nara"}, 17 {"M","O","1990","1","17","Saitama"}, 18 {"N","B","1991","11","29","Aichi"}, 19 {"O","B","1993","4","1","Aichi"}, 20 {"P","B","1994","11","25","Tokyo"} 21 }; 22 int k,i,j,leadi; 23 String lead, tmp; 24 for(k=1; k<senbatsu.length-1; k++){ 25 26 // k行目以下の先頭値leadとその行番号leadiを探す 27 lead = senbatsu[k][0]; 28 leadi = k; 29 for (i=k+1; i < senbatsu.length; i++) { 30 if(senbatsu[i][0].compareTo(lead)>0){ 31 lead =senbatsu[i][0]; 32 leadi =i; 33 } 34 35 // k行とleadi行(先頭行)を入替.入替時に変数tmpを使用する 36 for (j = 0; j < senbatsu[0].length; j++) { 37 tmp = senbatsu[k][j]; 38  senbatsu[k][j] = senbatsu[leadi][j]; 39   senbatsu[leadi][j] = tmp; 40    } 41 } 42 } 43 ///// 44 for(i=0; i<senbatsu.length; i++){ 45 System.out.print(senbatsu[i][0]); 46 for(j=1; j<senbatsu[i].length; j++){ 47 System.out.print(", "+senbatsu[i][j]); 48 } 49 System.out.println(""); 50 } 51 } 52}
### 試したこと 29行目を次のように変更しました。 変更前:i=k 変更後:i=k+1 ※先頭行の次から比較対象とするためi=k+1にしました。 しかし、上記に変更しても、最初の4行までしか入れかえを行うことができません。 どの箇所がまちがっているのか、アドバイスいただけないでしょうか。 よろしくお願いいたします。 ### 補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

jimbe

2023/05/27 04:06

>辞書順でAを先頭に持ってくる場合、先頭値をleadとして、 >if(lead.compareTo(senbatsu[k][0])>0)で比較することまでわかりました。 >しかし、アルファベット順(並び替える)にさせる方法がわかりませんでした。 比較することと並べ替えることは別のことです。 並び替える為に比較するのであって、並び替える方法が決まってこそ何をどう比較するかが決まります。 並び替えはいきなり言われて出来るものではありませんので、課題的にやっているのであれば事前に何か説明があったのではないでしょうか。
episteme

2023/06/02 00:54

> ソートすることができません。 どうなっちゃうんですか?
guest

回答4

0

Java

1public class Quiz9A { 2 public static void main(String[] args) { 3 String[][] senbatsu = { 4 {"Name","BloodType","Year","Month","Day","HomeTown"}, 5 {"A","O","1992","11","21","Oita"}, 6 {"B","B","1991","7","15","Kagoshima"}, 7 {"C","AB","1994","3","26","Saitama"}, 8 {"D","AB","1991","4","8","Tokyo"}, 9 {"E","B","1997","3","8","Aichi"}, 10 {"F","B","1993","7","14","Osaka"}, 11 {"G","A","1998","3","19","Kagoshima"}, 12 {"H","O","1990","8","13","Tokyo"}, 13 {"I","A","1994","3","30","Saitama"}, 14 {"J","B","1992","12","8","Kyoto"}, 15 {"K","A","1991","6","24","Aichi"}, 16 {"L","B","1993","9","19","Nara"}, 17 {"M","O","1990","1","17","Saitama"}, 18 {"N","B","1991","11","29","Aichi"}, 19 {"O","B","1993","4","1","Aichi"}, 20 {"P","B","1994","11","25","Tokyo"} 21 }; 22 23 // HomeTownをキーにソートしてみた 24 int key = 5; 25 int leadi = 0; 26 String lead = ""; 27 for ( int k = 1; k < senbatsu.length; k++ ) { 28 // k以降の行の中から最も小さいレコードを見つけ 29 for ( int i = k; i < senbatsu.length; i++ ) { 30 if ( i == k || senbatsu[i][key].compareTo(lead) < 0 ) { 31 lead = senbatsu[i][key]; 32 leadi = i; 33 } 34 } 35 // それとk行を入れ替える 36 String[] tmp = senbatsu[k]; 37 senbatsu[k] = senbatsu[leadi]; 38 senbatsu[leadi] = tmp; 39 } 40 41 // できたかな? 42 for ( int i = 0; i < senbatsu.length; i++ ) { 43 for ( int j = 0; j < senbatsu[i].length; j++ ) { 44 System.out.print((j == 0 ? "":", ") + senbatsu[i][j]); 45 } 46 System.out.println(); 47 } 48 } 49}

投稿2023/06/02 01:43

episteme

総合スコア16614

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

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

JAVA-B1

2023/06/02 02:57

ありがとうございます! アドバイスいただいたお陰で、 k行とleadi行を入れ替えるプログラムが 間違っていたことにきづきました。 ありがとうございました!
episteme

2023/06/02 05:43

k行とleadi行を入れ替える「位置」が間違っていた、ですね。
guest

0

java.util.Arrays.sort はソート範囲を指定できます。

Java

1class Main { 2 public static void main(String[] args) { 3 String[][] senbatsu = new String[][] { 4 {"Name", "BloodType", "Year", "Month", "Day", "HomeTown"}, 5 {"A", "O", "1992", "11", "21", "Oita"}, 6 {"B", "B", "1991", "7", "15", "Kagoshima"}, 7 {"C", "AB", "1994", "3", "26", "Saitama"}, 8 {"D", "AB", "1991", "4", "8", "Tokyo"}, 9 {"E", "B", "1997", "3", "8", "Aichi"}, 10 {"F", "B", "1993", "7", "14", "Osaka"}, 11 {"G", "A", "1998", "3", "19", "Kagoshima"}, 12 {"H", "O", "1990", "8", "13", "Tokyo"}, 13 {"I", "A", "1994", "3", "30", "Saitama"}, 14 {"J", "B", "1992", "12", "8", "Kyoto"}, 15 {"K", "A", "1991", "6", "24", "Aichi"}, 16 {"L", "B", "1993", "9", "19", "Nara"}, 17 {"M", "O", "1990", "1", "17", "Saitama"}, 18 {"N", "B", "1991", "11", "29", "Aichi"}, 19 {"O", "B", "1993", "4", "1", "Aichi"}, 20 {"P", "B", "1994", "11", "25", "Tokyo"} 21 }; 22 java.util.Arrays.sort(senbatsu, 1, senbatsu.length, 23 (String[] a, String[] b) -> { return a[0].compareTo(b[0]); }); 24 for (String[] s : senbatsu) 25 System.out.println(String.join(", ", s)); 26 } 27}

投稿2023/05/27 01:12

kazuma-s

総合スコア8224

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

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

0

ベストアンサー

1行目と2行目の}が無い(個数はあっていると思うのですが、終点と認識しません)

提示されているソースコードを見る限り、これは正しく実装できていると思われます。

アルファベット順に表示するプログラムが作成できているのか自信がありません。

ソースコードから推測するに選択ソートが必要だったのだと思います。これは以下の通り実装すればよいかと思います。

java

1int k,i,j,leadi; 2String[] lead, tmp; // String lead, tmp; はおそらくあやまり 3for(k=1; k<senbatsu.length-1; k++){ 4 ////ここから書き換える//// 5 leadi = k; 6 for (i = leadi+1; i < senbatsu.length; i++) { 7 if (senbatsu[i][0].compareTo(senbatsu[leadi][0]) < 0) { 8 leadi = i; 9 } 10 } 11 12 tmp = senbatsu[k]; 13 senbatsu[k] = senbatsu[leadi]; 14 senbatsu[leadi] = tmp; 15} 16/////ここまで////

投稿2023/05/26 06:57

neko_the_shadow

総合スコア2230

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

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

JAVA-B1

2023/06/02 02:52

ありがとうございます! 教えていただいた方法をもとに、 少しプログラムを修正することで、 無事、希望の出力結果となりました。 ありがとうございます!
guest

0

これでいい?
※ senbatsu そのものではなく、要素の添え字列:indicesをソートしています。

Java

1class Quiz9A { 2 public static void main(String[] args){ 3 String[][] senbatsu = new String[][] { 4 new String[] {"Name","BloodType","Year","Month","Day","HomeTown"}, 5 new String[] {"A", "O", "1992", "11", "21", "Oita" }, 6 new String[] {"B", "B", "1991", "7", "15", "Kagoshima"}, 7 new String[] {"C", "AB", "1994", "3", "26", "Saitama" }, 8 new String[] {"D", "AB", "1991", "4", "8", "Tokyo" }, 9 new String[] {"E", "B", "1997", "3", "8", "Aichi" }, 10 new String[] {"F", "B", "1993", "7", "14", "Osaka" }, 11 new String[] {"G", "A", "1998", "3", "19", "Kagoshima"}, 12 new String[] {"H", "O", "1990", "8", "13", "Tokyo" }, 13 new String[] {"I", "A", "1994", "3", "30", "Saitama" }, 14 new String[] {"J", "B", "1992", "12", "8", "Kyoto" }, 15 new String[] {"K", "A", "1991", "6", "24", "Aichi" }, 16 new String[] {"L", "B", "1993", "9", "19", "Nara" }, 17 new String[] {"M", "O", "1990", "1", "17", "Saitama" }, 18 new String[] {"N", "B", "1991", "11", "29", "Aichi" }, 19 new String[] {"O", "B", "1993", "4", "1", "Aichi" }, 20 new String[] {"P", "B", "1994", "11", "25", "Tokyo" } 21 }; 22 23 Integer[] indices = new Integer[senbatsu.length-1]; 24 for ( int i = 0; i < indices.length; ++i ) { indices[i] = i+1; } 25 26 java.util.Arrays.sort(indices, (Integer i, Integer j) -> { return senbatsu[i][0].compareTo(senbatsu[j][0]); }); 27 28 for ( int inx : indices ) { 29 for( int i = 0; i < senbatsu[inx].length; ++i ) { 30 System.out.print( (i == 0 ? "":", ") + senbatsu[inx][i] ); 31 } 32 System.out.println(); 33 } 34 } 35}

投稿2023/05/26 05:42

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問