通用二进制搜索Java

car*_*lly 4 java

我一直在尝试使这段代码工作.我必须创建二进制搜索的通用二进制版本.我不确定如何在没有类似界面的情况下比较两种泛型类型

import java.util.ArrayList; 

public class BinarySearcher<T> {
    private T[] a;

    public BinarySearcher(T[] words) {
        a = words;
    }

    public int search(T v) {
        int low = 0;
        int high = a.length - 1;
        while (low <= high) {
            int mid = (low + high) / 2;
            T midVal = a[mid];  

            if (v.compareTo(midVal) < 0) {
                low = mid - 1;
            }   

            else if (v.compareTo(midVal) > 0) {
                high = mid  + 1; 
            }
        }

        return -1;
    }

    public int compareTo(T a) {
        return this.value.compare - b;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是测试人员类:

import java.util.Arrays;
import java.util.Scanner;
/**
  This program tests the binary search algorithm.
*/
public class BinarySearchTester {
    public static void main(String[] args) {
        String[] words = {"Alpha", "Bravo", "Charlie", "Delta", "Echo", 
            "Foxtrot", "Golf", "Hotel", "India", "Juliet", "Kilo", "Lima", 
            "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo", 
            "Sierra", "Tango", "Uniform", "Victor", "Whiskey", "X-Ray", 
            "Yankee", "Zulu"};
        BinarySearcher<String> searcher = new BinarySearcher<String>(words);
        System.out.println(searcher.search("November"));
        System.out.println("Expected: 13");
        System.out.println(searcher.search("October"));
        System.out.println("Expected: -1");
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*rik 10

public class BinarySearcher<T extends Comparable<T>> { ...

这将允许您的BinarySearcher为可以比较的所有内容工作compareTo,这应该是通用的.


Jes*_*per 7

您的泛型方法无法比较某些任意类型的两个实例T,而没有任何约束T或有关于如何比较两个Ts的其他信息.

你有几个选择:

添加约束到T:

public class BinarySearcher<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)

或者通过在Comparator<T>你的search方法,其可称为做比较:

public int search(T v, Comparator<T> comp) {
    // ...
    if (comp.compare(v, midVal < 0)) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

旁注:我会避免compareTo在你的search方法中打两次电话; 你不知道比较这两个对象是否昂贵.而不是这个:

if (v.compareTo(midVal) < 0) {
    low = mid - 1;
}   
else if (v.compareTo(midVal) > 0) {
    high = mid  + 1; 
}
Run Code Online (Sandbox Code Playgroud)

做这样的事情:

int result = v.compareTo(midVal);
if (result < 0) {
    low = mid - 1;
}   
else if (result > 0) {
    high = mid  + 1; 
}
Run Code Online (Sandbox Code Playgroud)