我正在尝试创建一个二进制搜索程序,该程序可以使用各种类型的变量(int、float、string等)来查看数组中是否存在元素。我正试图找出如何比较变量。下面是我正在使用的内容的草图:
import java.util.ArrayList;
class BinarySearch{
//Receives the list as the first argument, and the number to search
// for as the second argument.
public static boolean binarySearch(Object list[], Object target) {
int listLen = list.length;
int min = 0;
int max = list.length - 1;
//execute the binary search
while (true) {
int guess = (min + max / 2);
if(target.equals(list[guess])) return true;
if(list < target) { //What to do here?
//do some stuff
...
我甚至不确定使用对象是否是最好的方法。
为输入参数使用泛型类型,并使输入参数包含比较器,以便用户可以完全控制如何比较传入的任何类型的输入。
签名看起来像
public static <T> int binarySearch(
T[] list, T target, java.util.Comparator<? super T> comparator)
这比让对象实现可比较要好,因为在不同的情况下,对象可能必须以不同的方式进行排序。如果使用Comparable,则只能使用由要比较的内容实现的方式,但是使用Comparable的搜索可以为输入列表的每种不同排序方式传入不同的比较器。
你的比较就变成了
int compareResult = comparator.compare(target, list[guess]);
其中结果为0表示2个对象相等,负结果表示第一个参数小于第二个参数,正结果表示第一个参数大于第二个参数。
检查您如何计算中点,您的代码由于运算符优先级的工作方式而中断。如果不小心,对于大数组(大于Integer.MAX\u值的一半)也可能会遇到问题。
我们可以使用Collections.binary搜索(...)方法从java集合api,除非我错过了什么。
您不应该使用对象,您需要使用泛型类或方法-在我的示例中,我使用第二个,因为您的方法是静态的:
public class BinarySearch
{
public static <T> boolean Run(T[] list, T target)
{
}
}
如果您需要比较值,您可以使用可比
将此对象与指定对象进行顺序比较。当此对象小于、等于或大于指定对象时,返回负整数、零或正整数。
让我们使T可比较
public class BinarySearch
{
public static <T extends Comparable<T>> boolean Run(T[] list, T target)
{
int listLen = list.length;
int min = 0;
int max = list.length - 1;
while (true) {
int guess = (min + max / 2);
if (target.equals(list[guess])) return true;
if (list[guess].compareTo(target) < 0) {
// list[guess] is less than target
} else {
// list[guess] is larget than target
}
}
}
由于大多数Java类都扩展了
可比较
,现在,您可以执行以下操作:
Integer[] ints = { 1, 2, 3, 4, 5, 6, 7, 8, 10, 25, 30, 50, 100 };
System.out.println(BinarySearch.Run(ints, 25));
// recognized as: System.out.println(BinarySearch.<Integer>Run(ints, 25));
String[] strings = {"a", "b", "c", "d", "e"};
System.out.println(BinarySearch.Run(strings, "c"));
// recognized as: System.out.println(BinarySearch.<String>Run(strings, "c"));
您还可以在
BinarySearch
中使用任何自定义类,如果它扩展了可比
问题内容: 我有两个从同一类实例化的java对象。 如果我将它们的两个属性都设置为完全相同的值,然后验证它们是否相同 但是,这些方法都不返回真实值。我已经检查了每个属性,并且它们匹配。 如何比较这两个对象以验证它们是否相同? 问题答案: 你需要提供自己的实现。 如果哈希表中有可能使用你的对象,则还应该重写。一个合理的实施将是该对象的字段的哈希码喜欢的东西结合起来:
问题内容: 我有上述2个类(POJO),它们都是绝对相同的(除了课程名称),我将它们添加到两个数组列表:aListA和aListB。我需要比较两个对象是否相同。如果它们相同,则需要将它们添加到另一个列表(commonList)中,如果它们恰好是不同的,则需要将它们添加到另一个列表(differentList)中。我写了以下代码: 我的问题是,即使两个不同POJO中的数据(变量,firstId和se
代码: 输出:(增加空白行以提高可读性) 有两件事我不明白: null 我还查看了date.equals()的实现: 那么,为什么返回false,尽管为两个对象都返回了1406498400000? 参考:http://docs.oracle.com/javase/7/docs/api/java/util/date.html#equals(java.lang.object)
我如何做到这一点?基本上映射列表中的每个字符串来创建一个对象,将其与fix对象进行比较,并基于其中一个属性返回max。谢了。
问题内容: 我必须将对象与预定义类的列表进行比较。 使用安全还是应该使用? 注意: 我不能使用,我没有对象,我只有对象。在这种情况下,我会像枚举一样使用它! 问题答案: 不会覆盖来自的方法,该方法是这样实现的: 因此与(除非为null)相同。
此外,我重写了hashCode()以: 现在,即使两个对象都是@dog0,print语句也会打印false。想知道为什么控制台: