使用二进制搜索与比较器来查找第一次出现

时间:2015-03-15 05:08:54

标签: java comparator binary-search

我试图对算法和数据结构类进行自动完成赋值,在赋值中它要求你创建一个类,它找到键的第一次出现,以及键的最后一次出现。

我遇到的问题是我不明白如何在这个问题中实现比较器,我在设置二进制搜索时遇到了问题,因为当我尝试比较密钥< a [mid]表示二进制运算符的坏操作数,因为即时通讯使用对象,我理解比较器生效了,但是怎么做?

//返回[]中等于搜索键的第一个键的索引,如果没有这样的键则返回-1。使用二进制搜索

    public static <Key>int firstIndexOf(Key[] a, Key key, Comparator<Key> comparator) {

        int low = 0;
        int high = a.length - 1;
        int result = -1;

        while (low <= high) {
            int mid = (low + high) / 2;
            if (key == a[mid]) {
                result = mid;
                high = mid - 1;
            }else if (key < a[mid]) { //**<--- throws bad operand type for binary operator**         
            high = mid - 1;   // key is probable to lie before mid element
            }else {
           low = mid +1;  // key is probable to lie after mid 
           }
        }
            return result;
}

我想假装传递的比较器喜欢这个,它在字符串中使用substring方法找到rValue,看看两个对象之间的前缀顺序是否匹配。再次,我不知道即使我甚至这样做是正确的开始,但那不是问题,问题是我将如何在其他类中实现这个

//比较词典顺序中的术语,但仅使用每个查询的前r个字符。

 public static class prefixOrder implements Comparator<Term> 
    { public prefixOrder(int r){
      rValue = r;
    }

    @Override
    public int compare(Term v, Term w){
    return  v.queryItem.substring(rValue).compareTo(w.queryItem.substring(rValue));
    }

    }

链接到作业 https://www.cs.princeton.edu/courses/archive/fall14/cos226/assignments/autocomplete.html

1 个答案:

答案 0 :(得分:0)

您无法在Java中编写key < a[mid],而是调用比较器的compare方法:

if (comparator.compare(key, a[mid]) < 0) ...

它的工作方式如下:比较方法返回正/零/负值,具体取决于比较结束的方式。我记得这样:

a OP b --> comparator.compare(a, b) OP 0

其中OP是&gt;,&gt; =,&lt;,&lt; =,==,!=

中的任何一个

此外,您可能希望将方法声明更改为:

public static <Key>int firstIndexOf(Key[] a, Key key, Comparator<? super Key> comparator)

因此,例如,您可以使用动物比较器选择Dogs数组中的最小值,其中Dog extends Animal。 (了解有关wildcards的更多信息。)