java - 使用二分查找方法查找项目的索引

标签 java list binary-search

所以我要把两个函数从使用顺序搜索重写为二分搜索。我了解两者之间的效率差异,但是,在将它们更改为二进制时,我在语法上遇到了问题。

类别

public class SortedList<Item extends Comparable<Item>> implements SortedList<Item> {

    private Object[] data = new Object[5];

    private int size = 0;

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public boolean equals(Object o) {
        SortedList<Item> lst = (SortedList<Item>) o;
        if (size != lst.size)
            return false;
        Iterator<Item> i1 = lst.iterator();
        Iterator<Item> i2 = iterator();
        while (i1.hasNext()) {
            Item x1 = i1.next();
            Item x2 = i2.next();
            if (!x1.equals(x2))
                return false;
        }
        return true;
    }

    //METHOD TO CHANGE TO BINARY-SEARCH
    public int indexOf(Item x) {
         int low = 0, high = size - 1;
         while (low <= high) {
            int mid = (low + high) / 2;
            if ((int) x == mid)
                return mid;
            else if ((int) x > mid)
                high = mid - 1;
            else
                low = mid + 1;
        }
        return -1;
     }

主要

public class Main {

    public static void main(String[] args) {

        SortedList<Integer> s = new SortedList<Integer>();

        s.add(5);
        s.add(6);
        s.add(7);
        s.add(8);
        s.add(9);
        s.add(10);

        System.out.println(s.indexOf(6)); //-1

    }
}

基本上,我在将 Item x 与整数进行比较时遇到问题。似乎即使当我将 x 转换为 Int 时,该函数仍然返回 -1。我在这个函数中比较的正确方法是什么?如果有必要,我还可以提供更多代码,我包含了我认为相关的所有代码。

最佳答案

您混淆了列表中的索引和元素:

if ((int) x == mid)

你想要:

if(x.equals(itemAtIndex(mid)))

关于java - 使用二分查找方法查找项目的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37401061/

相关文章:

java - Spring 4 Web服务HTTP 500 - IllegalStateException : The mapped controller method class is not an instance of the actual controller bean

java - FirebaseAuth.getInstance().signOut() 不注销

python - 从列表列表中删除所有匹配值

java - 为什么在二分查找中返回低位而不是高位?

c++ - 为什么我的二进制搜索需要额外的比较? log2(N)+1

java - 在 Linux 上使用类路径运行 Javac 命令

使用 Jackson 将 Java 映射到 JSON { "key":"value","key1":"value1"} 作为 "key":value, "key1":"value1"

list - 使用什么代替列表理解

html - 如何在左 :-20px;? 之后加宽 .li 右边缘

java - 对按降序排序的 int 数组使用二进制搜索