javaプログラムで、 プログラム中に10人分の番号、氏名、電話番号を書き、 二文探索を使って、入力した番号or氏名から電話番号を検索する というプログラムを作っています。 テキストなど頼りに作っているのですが、以下で手が詰まっています どこがおかしいですか import java.util.*; import java.io.*;//java.io クラスをインポートします public class search { static class _10data { private int number; //番号 private String name; //名前 private String phonenumber; //電話番号 public _10data(int number, String name, String phonenumber) { this.number = number; this.name = name; this.phonenumber = phonenumber; } public String toString() { return number + "" + name + "" + phonenumber; } public static void main(String args[]) throws IOException { Scanner stdln = new Scanner(System.in); _10data[] x = { new search._10data(2,"akiyama","9274621646"), new search._10data(1,"akai","9147965416"), new search._10data(4,"kato","8414817863"), new search._10data(5,"sakamoto","9548614769"), new search._10data(8,"tani","6456212314"), new search._10data(7,"tanaka","3215468548"), new search._10data(3,"katayama","5695195617"), new search._10data(6,"sato","1819316141"), new search._10data(9,"nakanishi","6865148642"), new search._10data(10,"nakamura","3136467825") }; System.out.println("誰の電話番号を検索?生徒番号or名前"); System.out.print("(数値:生徒番号検索、数値以外:名前検索、未入力:処理終了):"); //入力 String input; try { search._10data keyObj; int index; for (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ((input = br.readLine()) != null) && input.length() > 0;) { try { int num = Integer.parseInt(input); keyObj = new search._10data(num, null, null); search.NumberComp numComp = new search.NumberComp(); Arrays.sort(x, numComp); index = Arrays.binarySearch(x, keyObj, numComp); if (index > -1) { System.out.println("生徒番号検索の該当データ⇒" + x[index]); } else System.out.println("生徒番号検索の該当無し"); } catch(NumberFormatException e) { String name = input; keyObj = new search._10data(0, name, null); search.NameComp nmComp = new search.NameComp(); Arrays.sort(x, nmComp); index = Arrays.binarySearch(x, keyObj, nmComp); if (index > -1) { System.out.println("名前検索の該当データ⇒" + x[index]); } else System.out.println("名前検索の該当無し"); } System.out.print("(数値:生徒番号検索、数値以外:名前検索、未入力:処理終了):"); } System.out.println("処理を終了します。"); } catch(IOException e){System.err.println(e); } System.out.println(); //生徒番号検索で9を指定された場合、生徒番号検索キーとして_10dataのインスタンスをnumber=9で生成 search._10data keyObj = new search._10data(9,null, null); //生徒番号ソート、二分探索用のコンパレータのインスタンスを生成 search.NumberComp numComp = new search.NumberComp(); //生徒番号でソート(※binarySearchメソッドは事前に同条件でソートされていないと正しい結果を返せないので先にソートをかけています) Arrays.sort(x, numComp); //二分探索で該当したインデックスを取得(該当しなかった場合は不の値が戻る) int index = Arrays.binarySearch(x, keyObj, numComp); if (index > -1) { //該当したインデックスに紐付く情報を出力 System.out.println("生徒番号検索の該当データ⇒" + x[index]); } else System.out.println("生徒番号検索の該当無し"); //名前検索でkatayamaを指定された場合、名前検索キーとして_10dataのインスタンスをname="katayama"で生成 keyObj = new search._10data(0,"katayama", null); //名前ソート、二分探索用のコンパレータのインスタンスを生成 search.NameComp nmComp = new search.NameComp(); //名前でソート Arrays.sort(x, nmComp); //二分探索で該当したインデックスを取得 index = Arrays.binarySearch(x, keyObj, nmComp); if (index > -1) { //該当したインデックスに紐付く情報を出力 System.out.println("名前検索の該当データ⇒" + x[index]); } else System.out.println("名前検索の該当無し"); } } /** * コンパレータ1/名前昇順 * コンパレータはComparatorを実装する。この時、扱う型をジェネリックスで指定する。 * compareの戻り値には、以下の単純な規約がある。 * 昇順ソート: * 引数1のソートキー < 引数2のソートキー⇒戻り値=負の整数 * 引数1のソートキー == 引数2のソートキー⇒戻り値=0 * 引数1のソートキー > 引数2のソートキー⇒戻り値=正の整数 * 降順ソート:昇順の戻り値を符号反転すれば降順になる。 * ソートキーとなる名前=Stringクラスは、これらの戻り値を戻すcompareToメソッドが既に定義されているので、それを使う。 **/ static class NameComp implements Comparator<search._10data> { public int compare(search._10data a, search._10data b) { return a.name.compareTo(b.name); } } /** * コンパレータ2/生徒番号昇順
並び替え:
コンパレータ2/生徒番号昇順 のコードを追加してビルド・実行してみたところ、以下のようなエラーが発生していると思います。java.lang.NoSuchMethodError: mainひらたく言うとmainメソッドが定義されてませんよ、というエラーです。mainメソッドはpublicで宣言されているクラス(ここではsearchクラス)の直下に配置する必要があるので、_10dataクラスの外側に出してあげると、とりあえず動く所まで行くのではないかと思います。ひとまずヒントでした。
この機能は、特定のユーザーとの接触を避け、トラブルを防止するためにご用意しております。ブロックされたユーザーは、今後あなたの質問に回答ができなくなり、またそのユーザーの質問に対して、あなたも回答を投稿できなくなるという、重大な機能です。一度設定すると簡単に解除することができませんので、以下の点にご注意ください。
Sooda! は、ご利用者様同士の助け合いによって成り立つ知識共有サービスです。 多くの方に気持ちよくこのサイトを利用していただくために、事務局からのお願いごとがあります。
この投稿が、「禁止事項」のどの項目に違反しているのかを教えてください。 ご連絡いただいた内容がSooda! 事務局以外の第三者に伝わることはありません。
ご連絡いただきました内容は、当サイトの禁止事項に基づいて、事務局にて確認後、適切な対応をとらせていただきます。場合によっては、検討・対応に多少お時間を頂戴する場合もございます。
なお、誠に恐れ入りますが、今回のご連絡に関する対応のご報告は、結果をもって代えさせていただきます。対応の有無や判断基準に関しましては悪用を避けるため、事務局宛にお問合せいただきましても、ご回答およびメールのご返信はいたしかねますので、予めご了承くださいませ。
この質問を終了しますか?
質問をカテゴライズして、Sooda!をより良くしよう!
この質問を削除してもよろしいですか?
この回答を削除してもよろしいですか?
設定中のニックネームで質問したくない場合は、匿名で質問をすることが出来ます。 匿名で投稿する このニックネームを記憶する
一覧を見る