java - 利用 BinarySearch 进行自动完成练习

标签 java arrays autocomplete binary-search

嗨,我正在制作一个程序,该程序采用一系列“术语”,每个术语都有自己的权重(长值)和查询(字符串值)。它应该从 .txt 文件中获取许多术语并将它们初始化为私有(private)“Terms”数组,然后使用 arrays.sort 按字典顺序重新排列它们的查询。 Term[] allmatches(String prefix) 函数旨在利用二分搜索在已经按字典顺序排序的“Terms”数组中查找第一个匹配项开始和最后一个匹配项结束的位置(我确信我的 prefixOrder 比较器和我的二进制搜索方法本身就可以正常工作)。然后使用“for”循环,我尝试将所有这些特定术语复制到一个名为“newterms”的新数组中。问题是我只返回“null”值。

public class Autocomplete {
private Term[] terms;

/**
 * Initializes the data structure from the given array of terms.
 * @param terms a collection of terms.
 */
public Autocomplete(Term[] terms) {
   if (terms == null) {
        throw new java.lang.NullPointerException(); }
   this.terms = terms;
   Arrays.sort(terms);
}

/**
 * Returns all terms that start with the given prefix, in descending order 
 * of weight.
 * @param prefix term prefix.
 * @return all terms that start with the given prefix, in descending order 
 * of weight.
 */
public Term[] allMatches(String prefix) {
    if (prefix == null) {
        throw new java.lang.NullPointerException(); }
    Term term = new Term(prefix);
    Comparator<Term> prefixOrder = Term.byPrefixOrder(prefix.length());
    int a = BinarySearchDeluxe.firstIndexOf(this.terms, term, prefixOrder);
    int b = BinarySearchDeluxe.lastIndexOf(this.terms, term, prefixOrder);
    int c = a;
    Term[] newterms = new Term[b - a];
    for (int i = 0; i > b - a; i++) {
        newterms[i] = this.terms[c];
        c++;
    }
    Arrays.sort(newterms, Term.byReverseWeightOrder());
    return newterms;
}

这是我正在使用的“测试”客户端:

     public static void main(String[] args) {
    String filename = args[0];
    In in = new In(filename);
    int N = in.readInt();
    Term[] terms = new Term[N];
    for (int i = 0; i < N; i++) {
        long weight = in.readLong(); 
        in.readChar(); 
        String query = in.readLine(); 
        terms[i] = new Term(query, weight); 
    }
    int k = Integer.parseInt(args[1]);
    Autocomplete autocomplete = new Autocomplete(terms);
    while (StdIn.hasNextLine()) {
        String prefix = StdIn.readLine();
        Term[] results = autocomplete.allMatches(prefix);
        for (int i = 0; i < Math.min(k, results.length); i++) {
            StdOut.println(results[i]);
        }
    }
}

我在这里做错了什么?非常感谢您的帮助,谢谢。

最佳答案

allMatches(String prefix) 中的 for 循环有一个错误的 boolean 谓词,而不是

for (int i = 0; i > b - a; i++)

应该是

for (int i = 0; i < b - a; i++)

关于java - 利用 BinarySearch 进行自动完成练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30969884/

相关文章:

java - Java Swing 定时器中的负延迟

python - 将文件打开到数组中,搜索字符串并返回值

html - VSCode:CSS中的自动完成功能是在您的HTML标记中首先创建的类。为此扩展吗?

cocoa - 微调 NSTextField 自动完成

Java泛型接口(interface)实现

java - 如何在JAVA中转义Restful API查询字符串中的特殊字符

java - 使用 javax.print API 打印纯文本

C - 从文件读取 - 为什么打印错误?

mySQL 最大值(按唯一条目)

html - 在不禁用自动完成的情况下禁用 Chrome 中的表单自动填充