Java-binarySearch()。如何设置用于拼写检查的二进制搜索

Java-binarySearch()。如何设置用于拼写检查的二进制搜索,java,binary-search,Java,Binary Search,我正在做一个拼写检查项目。我有一张字表,然后是葛底斯堡演讲稿,还有一些拼错的单词。我的工作是识别哪些单词拼写错误,然后在打印地址时,在拼写错误的单词下打印星号或其他内容。我的问题在binarySearch部分。我不确定语法,javadoc看起来像是中文的。下面是我的源代码binarySearch位于底部 /* * Assignment 1: Spell Check * Professor Subrina Thompson * CS102 */ package spellcheck; i

我正在做一个拼写检查项目。我有一张字表,然后是葛底斯堡演讲稿,还有一些拼错的单词。我的工作是识别哪些单词拼写错误,然后在打印地址时,在拼写错误的单词下打印星号或其他内容。我的问题在binarySearch部分。我不确定语法,javadoc看起来像是中文的。下面是我的源代码binarySearch位于底部

/*
 * Assignment 1: Spell Check
 * Professor Subrina Thompson
 * CS102
 */
package spellcheck;

import java.util.*;
import java.io.*;

public class SpellCheck {

    //48,219 words in the words.txt

    //Declare Variables
    static FileReader reader;
    static Scanner input;
    static ArrayList <String> wordList = new ArrayList<String>();
    static FileReader reader2;
    static Scanner input2;
    static String testWord;
    static String index;

    //Main Method
    public static void main(String[] args) throws FileNotFoundException {
        fileSort();
    }

    //Open file to be read from
    public static void openFile() throws FileNotFoundException {
        reader = new FileReader("words.txt");
        input = new Scanner(reader);

    }

    //sort the file
    public static void fileSort() throws FileNotFoundException{
        openFile();

        //read the word list into an ArrayList
        while (input.hasNext()){
            wordList.add(input.next());
        }

        //Sort the array
        Collections.sort(wordList);
    }

    //read the gettysburg address
    public static void gAddress()throws FileNotFoundException{
        reader2 = new FileReader("gettysburg.txt");
        input2 = new Scanner(reader2);

        //create loop to place word from file into a var then test to see if it is in the dictionary
        for(int i = 0; i < wordList.size(); i++){

            //place the word into a variable
            testWord = input2.next();

            //test if the word is in the dictionary
            index = Collections.binarySearch(wordList,testWord);
        }
    }

    //compare the address and array through binary search 

    //print out if spelling is correct
}
另外,我知道它不完整,有很多松散的结尾,它仍然是一个正在进行的工作

编辑:

我试着根据我对binarySearch工作原理的理解来创建一个新的搜索函数。这是该函数的代码。字符串w将是要针对地址中的测试字进行测试的字典字:

公共静态int二进制搜索字符串w{

        int start = 0;
        int stop  = wordList.size() - 1;

        while (start != stop){
            int half = ((stop - start)/2) + start;
            int res = wordList.get(half).compareToIgnoreCase(w);

            if( res == 0 ){
                return half;
            }
        else if( stop - start <= 1 ){
                return -1;
            }
        else if( res > 0 ){
                start = half;
            }
        else if( res < 0 ){
                stop  = half;
            }


   }

   return -1;
}
这就是您所需要的:

if(index < 0) {
  System.out.println(testWord + " not in dictionary");
}
此外,通过检查索引的绝对值,您可以很容易地在字典中找到按字母顺序与键入错误的单词相近的单词。

这就是您所需要的:

if(index < 0) {
  System.out.println(testWord + " not in dictionary");
}
此外,通过检查索引的绝对值,您可以很容易地在字典中找到按字母顺序与您键入的错误单词相近的单词

创建循环,将文件中的单词放入var中,然后测试它是否在字典中

但这不是你要做的。你正在创建一个循环来遍历字典中的所有单词,并检查地址中的下一个单词是否在字典中,而不管它是否被找到,你都不做任何事情

如果字典中有更多的单词,那么地址可能会出现异常,如果地址中有更多的单词,那么您不会全部检查

创建循环,将文件中的单词放入var中,然后测试它是否在字典中

但这不是你要做的。你正在创建一个循环来遍历字典中的所有单词,并检查地址中的下一个单词是否在字典中,而不管它是否被找到,你都不做任何事情


如果字典中有更多的单词,那么地址可能会出现异常,如果地址中有更多的单词,那么你不会检查所有的单词。

javadoc看起来像中文,因为列表是通用的

public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
之后的索引将包含列表中搜索键的索引,如果未找到该键,则为负数。更准确地说:

搜索键的索引(如果它包含在列表中);否则, -插入点-1。插入点定义为点 将键插入列表的位置: 大于键的第一个元素,如果所有元素都在 列表小于指定的键。请注意,这保证 当且仅当找到键时,返回值将>=0


javadoc看起来像中文,因为列表是通用的

public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
之后的索引将包含列表中搜索键的索引,如果未找到该键,则为负数。更准确地说:

搜索键的索引(如果它包含在列表中);否则, -插入点-1。插入点定义为点 将键插入列表的位置: 大于键的第一个元素,如果所有元素都在 列表小于指定的键。请注意,这保证 当且仅当找到键时,返回值将>=0


他仍然会遇到我在回答中概述的问题他仍然会遇到我在回答中概述的问题谢谢你提供的信息,但我仍然有点困惑这里的java n00b lol,请耐心听我说。在最后一段代码中,为什么返回类型是int?我如何使用文件代替字符串键?Collections.binarySearch w我不会在列表中搜索一个文件,只搜索一个单键,其中许多键可以从文件中读取并在列表中逐个查找。我已经用一个特定的调用更新了答案。返回类型是int,因为它有点隐晦地这样说:public static int binarySearchyadayadayada感谢您提供的信息,但我仍然有点困惑java n00b在这里lol,请耐心听我说。在最后一段代码中,为什么返回类型是int?我如何使用文件来代替字符串键?Collections.binarySearch不会在列表中搜索文件,只搜索一个键,其中许多键可以从文件中读取并在列表中逐个查找。我已使用特定的调用。返回类型是int,因为它有点隐晦地说:public static int binarySearchyadayada实际上代码不工作。我对binarySearch行有问题。可能是因为索引是一个字符串,应该是另一种类型?我不确定这是什么。我以前从未使用过binarySearch,所以我不熟悉我的具体操作若索引是一个字符串,你们的程序甚至不会编译它。它会编译吗?呃,com和
打桩错误和运行时错误。你面对的是哪一个?实际上代码不起作用。我发现binarySearch行有问题。可能是因为索引是一个字符串,应该是另一种类型?但是我不知道会发生什么。我以前从未使用过binarySearch,所以我不知道如果索引是一个字符串,程序甚至不会编译,它会返回什么。它会编译吗?呃,编译错误和运行时错误是有区别的。你面对的是哪一个?
index = Collections.binarySearch(list, key);