0

リスト形式の単語のテキストファイルを検索する方法を書いています。ユーザーが入力した単語を検索しますが、プログラムによって、1文字でも見つかった場合は肯定的な結果が返されます。たとえば、「f」を検索すると辞書に単語 "F" がない場合、単語 "F" があることを返します。

public static void Option3Method(String dictionary) throws IOException {
    Scanner scan = new Scanner(new File("wordlist.txt"));
    String s;
    String words[] = new String[500];
    String word = JOptionPane.showInputDialog("Enter a word to search for");
    while (scan.hasNextLine()) {
        s = scan.nextLine();
        int indexfound = s.indexOf(word);
        if (indexfound > -1) {
            JOptionPane.showMessageDialog(null, "Word was found");
        } else if (indexfound < -1) {
            JOptionPane.showMessageDialog(null, "Word was not found");
        }
    }
}
4

5 に答える 5

1
if (indexfound>-1)
{ 
    JOptionPane.showMessageDialog(null, "Word was found");
}
 else if (indexfound<-1)
 {
    JOptionPane.showMessageDialog(null, "Word was not found");}
 }

このコードの問題は、indexFoundが と等しくなる可能性がありますが-1、 未満になることはありません-1<オペレーターのオペレーターを変更し==ます。

代替案

Stringこれは、が別の に存在するかどうかを確認するための非常にあいまいな方法ですStringmatchesメソッドを String オブジェクトで使用する方がはるかに適切です。これがドキュメントです。

何かのようなもの:

String phrase = "Chris";
String str = "Chris is the best";
// Load some test values.
if(str.matches(".*" + phrase + ".*")) { 
    // If str is [something] then the value inside phrase, then [something],true.
 }
于 2013-04-07T16:44:03.020 に答える
0

あなたのコードにはいくつかの混乱があります。

  • ファイル全体に対して1回ではなく、単語ごとに1回結果を出力しているようです。
  • 辞書がある場合、通常は 1 行に 1 つの単語しかないため、一致するか一致しないかのいずれかになります。あなた(および他のほとんどの回答)が、おそらくあなたが望むものではない長い文字列内の単語を見つけようとしているようです。'ee' を検索する場合、'beer' で検索したくありませんよね?

したがって、辞書が 1 行に 1 つの有効な単語であり、辞書全体のどこにもその単語を見つけたくない場合、この簡単なコードでうまくいきます。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File("wordlist.txt"));
        String word = "Me";
        try {
            while (scanner.hasNextLine()) {
                if (scanner.nextLine().equalsIgnoreCase(word)) {
                    System.out.println("word found");
                    // word is found, no need to search the rest of the dictionary
                    return;
                }
            }
            System.out.println("word not found");
        }
        finally {
            scanner.close();
        }
    }
}
于 2013-04-07T17:05:16.127 に答える
0

String#indexOf次のようなメソッドを使用する代わりにString#matches:

boolean matched = s.matches("\\b" + word + "\\b");

これにより、ユーザーが入力した単語が単語境界のある行にあることが確認されます。

ところで、500 個の要素を持つ String 配列を宣言した理由は明らかwordsではありません。どこでも使用していません。

于 2013-04-07T16:41:00.097 に答える
0

あなたは手紙を言います、あなたは言葉を言います、あなたは正確に何を検索しますか?

単語を検索する場合、単語境界内の単語を検索する必要があります: regex java.util.regex.Pattern \b で示されるanubhava

java.lang.indexOf()が見つからない場合は -1 >-1 を返すため、それ以外の場合は < -1 は発生しないため、置き換え} else if (indexfound < -1) {てもかまいません。} else {

于 2013-04-07T16:42:44.167 に答える
0

「else if」ステートメントは次のようになります

} else if (indexfound == -1){

部分文字列が見つからない場合、indexOf メソッドは正確に -1 を返すためです。

于 2013-04-07T16:45:02.120 に答える