Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

文字列内の漢字検索

フォームで入力された氏名か番号があらかじめ作成された配列内に同じ要素があるとき
番号・名前・点数を連結してテキストボックスに表示する
同じ要素が存在しないとき「ありません」をテキストボックスに表示する

という機能を持ったプログラムを作成していたのですが入力された漢字の一致検索がなぜか失敗してしまいます。
どうすれば漢字の一致検索が成功できるのでしょうか?

6

回答

6687

閲覧

6件の回答

評価

0

以下作成したプログラム

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class MainProgram extends JFrame implements ActionListener{

    public static void main(String[] args) {
        new MainProgram();
    }


    int[] namber = new int[]{1,2,3,4,5,6,7,8,9,10};
    String[] name = new String[]{"田中士郎","竹田雲雀","三木裕也","佐々木謙哉","岩田裕也","能登真美子","泉真一","佐川急便","阿賀美穂","加賀美優"};
    int[] point = new int[]{75,55,87,22,35,90,80,15,45,100};

    JTextField text = new JTextField();
    JTextField text2 = new JTextField();
    JButton button = new JButton("検索");
    JLabel ansLabel = new JLabel("検索結果");

    MainProgram() {
        getContentPane().setLayout(null);

        text.setBounds(50,50,300,40);
        getContentPane().add(text);

        button.setBounds(200, 100, 100, 50);
        button.addActionListener(this);
        getContentPane().add(button);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500,500);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        String str = text.getText();
        String ans = " ";

        if( str.isEmpty() )
            text2.setText("入力されていません");
        else{

            for( int i = 0; i < name.length; i++ )
            {
                if( name[i].matches("*" + str + "*") || str.matches("" + namber[i]))
                {
                    ans.concat(name[i] + " " + namber[i] + " " + point[i]);
                    break;
                }
            }
            if( ans.equals(" ") )
                text2.setText("ありません");
            else
                text2.setText(ans);
        }

        ansLabel.setBounds(50,1500,200,50);
        getContentPane().add(ansLabel);
        text2.setBounds(50,250,300,40);
        getContentPane().add(text2);
    }
}

評価

0

1. matches()で"*ほげほげ*"なんてのは使えない。
ワイルドカードと勘違いしてないか。
2. 「中」だけ検索すると田中君と竹田君、岩田君の3つに
マッチするがそのロジックでは田中君が選ばれる。
問題ないのか?
3. numberとmatches()で比べようという意図も分からない
な。
完全一致ならequals()で良いだろう。

あとnumberのスペルミス。

評価

0

あ、肝心なの書くの忘れた。
4. concat()はその変数自体を置き換えるものではない。
Stringは常に不変だ。
そもそも現在のansに連結する必要がなく、単なる代入で
良いように見える。

評価

0

回答ありがとうございます。

2の内容については今は構いません
まず検索がちゃんとできることが前提になりますので・・・

3は指摘通りにequals()に変更しました。
よくよく考えればこっちのほうが合ってました・・・

名前の検索はmatches()とindexOf()のどっちのほうが良いのでしょうか?
現状 田と入力しても「ありません」と出力されます・・・

評価

0

すいません
4を見る前に回答を書いていたので・・・

4の修正後に「田」と検索すると田中君が出力できました!
ありがとうございました<(_ _)>

評価

0

意図通りうごくようになったら、今度はそれを効率化する
ことを考えてみるといいよ。
今のままではだいぶん無駄がある。
例えばnumberを数値で使うことがないなら、最初から
Stringでいいじゃん、とかね。

今すぐでなくても、しばらくしてから以前作ったものを
見直してみるのもいい。
いろいろ試してみればそれが力になって、コードを1から
書く時に最初からある程度効率のいいコードを書けるように
なつていくから。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。