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

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

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

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

配列

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

Q&A

解決済

1回答

3997閲覧

JAVA 2次元配列でソートをしたいです。

takahasi

総合スコア11

Java

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

配列

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

1グッド

1クリップ

投稿2016/10/26 04:21

編集2016/10/26 05:34

###前提・実現したいこと

使用言語はJAVAです。 学生の情報を管理するプログラムを2次元配列で作っています。 ソートできるようにしたいのですが、ComparatorかArraysがうまくいきません。 プログラミング経験はC言語半年、JAVA2日です。

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

エラーは出ないのですが、ソートしようとすると強制終了します 注意:takahasi.javaの操作は、未チェックまたは安全ではありません。 注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。 またソートしたときに Exception in thread "main" java.lang.NullPointerException at takahasi$TheComparator.compare(takahasi.java:292) at java.util.TimSort.countRunAndMakeAscending(Unknown Source) at java.util.TimSort.sort(Unknown Source) at java.util.Arrays.sort(Unknown Source) at takahasi.main(takahasi.java:243) のようなエラーが出て強制終了します。

###該当のソースコード

import java.util.Arrays; import java.util.Comparator; public class takahasi{ public static void main(String[] args){ String[][] namebox;//生徒の名前を入れる場所 namebox = new String[100][100]; 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){//生徒の情報を入力 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==2){//生徒の情報を編集 System.out.println("what do you want to edit?"); System.out.println("1.name or 2.code or 3.address or 4.gender or 5.math or 6.phy or 7.che"); System.out.println("please type number"); int editnumber = new java.util.Scanner (System.in).nextInt(); if(editnumber==1){ String editname = new java.util.Scanner (System.in).nextLine(); namebox[current][0]=editname; } if(editnumber==2){ String editcode = new java.util.Scanner (System.in).nextLine(); namebox[current][1]=editcode; } if(editnumber==3){ String editaddress = new java.util.Scanner (System.in).nextLine(); namebox[current][2]=editaddress; } if(editnumber==4){ String editgender = new java.util.Scanner (System.in).nextLine(); namebox[current][3]=editgender; } if(editnumber==5){ String editmath = new java.util.Scanner (System.in).nextLine(); namebox[current][4]=editmath; } if(editnumber==6){ String editphy = new java.util.Scanner (System.in).nextLine(); namebox[current][5]=editphy; } if(editnumber==7){ String editphy = new java.util.Scanner (System.in).nextLine(); namebox[current][6]=editphy; } if(editnumber>=5){ String mathh=namebox[current][4]; String phyy=namebox[current][5]; String chee=namebox[current][6]; int editmaths=Integer.parseInt(mathh); int editphys=Integer.parseInt(phyy); int editches=Integer.parseInt(chee); int editgoukei=editmaths+editphys+editches; namebox[current][7]=String.valueOf(editgoukei); } } if(number==3){//生徒の情報を削除 for(int y=current;y<t;y++){ namebox[y][0]=namebox[y+1][0]; namebox[y][1]=namebox[y+1][1]; namebox[y][2]=namebox[y+1][2]; namebox[y][3]=namebox[y+1][3]; namebox[y][4]=namebox[y+1][4]; namebox[y][5]=namebox[y+1][5]; namebox[y][6]=namebox[y+1][6]; namebox[y][7]=namebox[y+1][7]; } t--; } if(number==4){//登録されている生徒の情報を表示 for(int see=0;see<t;see++){ String seename = namebox[see][0]; String seecode = namebox[see][1]; String seeaddress = namebox[see][2]; String seejender = namebox[see][3]; String seemath = namebox[see][4]; String seephy = namebox[see][5]; String seeche = namebox[see][6]; String seepoint = namebox[see][7]; System.out.println(seename+seecode+seeaddress+seejender+seemath+seephy+seeche+seepoint); } } if(number==5){//登録されている生徒の情報を検索 System.out.println("Who do you want to search?"); System.out.println("1.totalp or 2.code or 3.name or 4.mathp or 5.phyp or 6.chep"); System.out.println("please type number"); int searchnumber = new java.util.Scanner (System.in).nextInt();//数の入力受付 if(searchnumber==1){//合計得点で検索 System.out.println("please type point");//数を入力しろ String tp = new java.util.Scanner (System.in).nextLine();//数の入力受付 for(int i=0;i<t;i++){ if(namebox[i][7].equals(tp)){ current=i; } } } if(searchnumber==2){//生徒コードで検索 System.out.println("please type code");//数を入力しろ String codes = new java.util.Scanner (System.in).nextLine();//数の入力受付 for(int i=0;i<t;i++){ if(namebox[i][1].equals(codes)){ current=i; } } } if(searchnumber==3){//生徒の名前で検索 System.out.println("please type name");//数を入力しろ String names = new java.util.Scanner (System.in).nextLine();//名前入力受付 for(int i=0;i<t;i++){ if(namebox[i][0].equals(names)){ current=i; } } } if(searchnumber==4){//数学の得点で検索 System.out.println("please type points");//数を入力しろ String mathss = new java.util.Scanner (System.in).nextLine();//名前入力受付 for(int i=0;i<t;i++){ if(namebox[i][4].equals(mathss)){ current=i; } } } if(searchnumber==5){//phyの得点で検索 System.out.println("please type points");//数を入力しろ String physs = new java.util.Scanner (System.in).nextLine();//名前入力受付 for(int i=0;i<t;i++){ if(namebox[i][5].equals(physs)){ current=i; } } } if(searchnumber==6){//cheの得点で検索 System.out.println("please type points");//数を入力しろ String chess = new java.util.Scanner (System.in).nextLine();//名前入力受付 for(int i=0;i<t;i++){ if(namebox[i][6].equals(chess)){ current=i; } } } } 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(); if(sortnumber==1){ comparator.setIndex( 1 ); Arrays.sort( namebox, comparator ); } if(sortnumber==2){ comparator.setIndex( 0 ); Arrays.sort( namebox, comparator ); } if(sortnumber==3){ comparator.setIndex( 7 ); Arrays.sort( namebox, comparator ); } } } } 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 ] ) ); } } }

###試したこと
8時間ぐらい考え続けているのですが、解決策がわかりません。

###補足情報(言語/FW/ツール等のバージョンなど)
jdk1.7.0_79を使っています

DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

貼り付けてあるソースコードを手元のEclipseで貼り付けて
動かしてみたところ、ちゃんと動作しました。
ゆえに、そちらの実行環境に問題があると思われます。

もし、IDEでの開発に抵抗がないのであれば、Eclipseなどを導入し、
デバッグしてみてはいかがですか。

どうしてもコンソールでのjava実行に拘りたいというのであれば、
javaの実行時のオプションに問題があると思われますので
そちらを調査してください。

投稿2016/10/26 05:07

akio221

総合スコア716

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

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

akio221

2016/10/26 05:44 編集

追記されたようなので、お答えします。 エラーメッセージの根っこ、 >at takahasi.main(takahasi.java:243) つまり、 > Arrays.sort( namebox, comparator ); ここがエラーの呼び出し元です。 で、エラーを実際に吹いたのが、 >at takahasi$TheComparator.compare(takahasi.java:292) なので、 > return ( strA[ index ].compareTo( strB[ index ] ) ); ここでNullぽになっています。 compareの内部側ではNullを処理してくれるので、 strA[ index ]がNullなのではないですか。 入力されたデータがいかようなものなのか分からないので推測ですが。
takahasi

2016/10/26 06:23

回答ありがとうございます。 Eclipseでやってみましたが、同じエラーが出ました。 対策を考えてみます。
takahasi

2016/10/26 06:50

namebox = new String[100][100];にしてあるのが原因でしょうか?
akio221

2016/10/26 06:56

javaのStringはオブジェクト型です。 配列として準備した場合、当該オブジェクトのポインタを 保存する箱として配列が準備されます。 ゆえに[100][100]の宣言だけでは、配列に準備されるのは、 nullであるポインタが[100][100]なのです。
takahasi

2016/10/26 07:08

ということはarraycopyなどを使って、配列の容量を適宜調整するしかなさそうですね。 2次元配列を使い続ける限り。他に方法があれば教えていただけると嬉しいです。
akio221

2016/10/26 07:17

古典的なjava手法であれば、getter/setterを持つオブジェクトを作成し、 これに一連の生徒レコードを入れて、それらをListに入れることで よいのではないでしょうか。 厳格なgetter/setterにこだわりがなければ、マップ型に キー名と値という形で投入したものをListに保持すれば 良いのではないでしょうか。 キー名も配列で持っておけば、誤りを減らすことはできます。 List<Map<String,Object>> recordList = new ArrayList<>(); Map<String,Object> map = new HashMap<>(); map.put("id", 入力されたID); map.put("name", 入力された名前); recordList.add(map); どちらもList型で動的に追加することにはなろうかと。 getter/setterについてのコンパレータ実装はうろ覚えですが、 MAP型とLISTなら、ソートするのにコンパレータ実装でいけるはずです。
takahasi

2016/10/26 16:12

解決しました。 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); でなんとかしました。 しかし、ソートがうまく出来ていないという問題に直面したので新たな質問を立てたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問