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

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

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

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

配列

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

Q&A

解決済

1回答

4281閲覧

JAVA 2次元配列のソートがうまく出来ません。

takahasi

総合スコア11

Java

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

配列

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

0グッド

0クリップ

投稿2016/10/26 16:31

生徒の情報を管理するプログラムです。
JAVAです。
2次元配列のソートがうまく出来ません。
ローマ字は正しくソートできるのですが、数字がソートできていません。
原因が分かりません。教えてください。
SBDは2番めの要素でcodeです。total pointsは右端の数です。
実行結果

1.Add or 2.edit or 3.delete or 4.see or 5.search or 6.sort please type number 6 How do you sort? 1.SBD or 2.alphabet or 3.total points please type number 3 fghfd 62 ryer ret 63 74 23 160 fdg 34 dgre sdf 123 43 1 167 er 324 fdg ye 32 5 12 49 sgfg 132 rtert ef 12 32 54 98 dedfg 32 fg htdh 43 12 43 98 dedfg 1.Add or 2.edit or 3.delete or 4.see or 5.search or 6.sort please type number 6 How do you sort? 1.SBD or 2.alphabet or 3.total points please type number 2 dedfg 32 fg htdh 43 12 43 98 er 324 fdg ye 32 5 12 49 fdg 34 dgre sdf 123 43 1 167 fghfd 62 ryer ret 63 74 23 160 sgfg 132 rtert ef 12 32 54 98 sgfg 1.Add or 2.edit or 3.delete or 4.see or 5.search or 6.sort please type number
package sort; import java.util.Arrays; import java.util.Comparator; public class takahasi{ public static void main(String[] args){ String[][] namebox;//生徒の名前を入れる場所 String[][] copybox; namebox = new String[0][8]; copybox = new String[0][8]; int t=0;//生徒数 int current=0;//現在注目している生徒 while(true){ if(t>0){ String namec = namebox[current][0]; System.out.println(namec); } System.out.println("1.Add or 2.edit or 3.delete or 4.see or 5.search or 6.sort");//最初の選択 System.out.println("please type number");//数を入力しろ int number = new java.util.Scanner (System.in).nextInt();//数の入力受付 if(number==0){ break; } if(number==1){ copybox = new String[t][8]; System.arraycopy(namebox,0,copybox,0,t); namebox = new String[t+1][8]; System.arraycopy(copybox,0,namebox,0,t); System.out.println("name"); String name = new java.util.Scanner (System.in).nextLine(); namebox[t][0]=name; System.out.println("code"); String code = new java.util.Scanner (System.in).nextLine(); namebox[t][1]=code; System.out.println("address"); String address = new java.util.Scanner (System.in).nextLine(); namebox[t][2]=address; System.out.println("gender"); String gender = new java.util.Scanner (System.in).nextLine(); namebox[t][3]=gender; System.out.println("math"); String math = new java.util.Scanner (System.in).nextLine(); namebox[t][4]=math; System.out.println("phy"); String phy = new java.util.Scanner (System.in).nextLine(); namebox[t][5]=phy; System.out.println("che"); String che = new java.util.Scanner (System.in).nextLine(); namebox[t][6]=che; int maths=Integer.parseInt(math); int phys=Integer.parseInt(phy); int ches=Integer.parseInt(che); int goukei=maths+phys+ches; namebox[t][7]=String.valueOf(goukei); current=t; t++; } if(number==6){ System.out.println("How do you sort?"); System.out.println("1.SBD or 2.alphabet or 3.total points"); System.out.println("please type number"); int sortnumber = new java.util.Scanner (System.in).nextInt(); TheComparator comparator = new TheComparator(); int[][] pointcopy; pointcopy = new int[t][8]; if(sortnumber==1){ comparator.setIndex( 1 ); Arrays.sort( namebox, comparator ); dump( namebox ); } if(sortnumber==2){ comparator.setIndex( 0 ); Arrays.sort( namebox, comparator ); dump( namebox ); } if(sortnumber==3){ comparator.setIndex( 7 ); Arrays.sort( namebox, comparator ); dump( namebox ); } } } } static public void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } static class MyComparator implements Comparator { public int compare(Object o1,Object o2){ int n1 = o1.toString().length(); int n2 = o2.toString().length(); return n1 < n2 ? -1 : 1; } } static public class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

数値で比較しているのではなく、文字列として比較しているからです。
辞書で「赤(あか)」より「糸(いと)」があとに来るように、
「167」より「49」があとに来ます(最初の文字を比較して早いほうが先に来る)。
数値比較したいなら、Integer.parseIntなどで数値に変換してから比較しないとだめですが、
今やっているようなComparatorで画一的に操作するのは難しくなりますね。

そもそもComparatorの使い方が変です。
型パラメータとともに使ってこそのジェネリクスです。

java

1static public class TheComparator implements Comparator<String[]> { 2 3 /** ソート対象のカラムの位置 */ 4 private int index = 0; 5 6 /** ソートするためのカラム位置をセット */ 7 public void setIndex( int index ) { 8 this.index = index; 9 } 10 11 public int compare(String[] a, String[] b ) { 12 return a[index].compareTo(b[index]); 13 } 14}

投稿2016/10/26 16:44

編集2016/10/27 01:26
swordone

総合スコア20651

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

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

takahasi

2016/10/27 03:54

使い方変なんですね。動いてるので正しく使えていると思っていました。もう一度勉強し直します。 トラブルは、数字の比較だけ型変換してif文とfor文でなんとかしました
swordone

2016/10/27 07:28

ジェネリクスを使ったクラスを、型パラメータを使わずに使用しているものを未加工型、もしくはraw型と呼びます。一応まだ使えはしますが、過去バージョンとの互換性のために残っているだけです。 型安全性の問題から、将来的になくなる可能性もあるので、型パラメータを使いましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問