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

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

ただいまの
回答率

89.10%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,724

takahasi

score 11

前提・実現したいこと

使用言語は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を使っています

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/26 16:08

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

    キャンセル

  • 2016/10/26 16: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なら、ソートするのにコンパレータ実装でいけるはずです。

    キャンセル

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

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る