すべてのカテゴリ » インターネット・パソコン » 技術・プログラミング

質問

終了

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/生徒番号昇順

  • 質問者:ロンド
  • 質問日時:2010-02-10 01:08:32
  • 0

並び替え:

コンパレータ2/生徒番号昇順 のコードを追加してビルド・実行してみたところ、以下のようなエラーが発生していると思います。
java.lang.NoSuchMethodError: main

ひらたく言うとmainメソッドが定義されてませんよ、というエラーです。
mainメソッドはpublicで宣言されているクラス(ここではsearchクラス)の直下に配置する必要があるので、_10dataクラスの外側に出してあげると、とりあえず動く所まで行くのではないかと思います。

ひとまずヒントでした。

この回答の満足度
  

関連する質問・相談

Sooda!からのお知らせ

一覧を見る