使用compareTo的Java Arrays.binarySearch

时间:2014-02-09 19:54:55

标签: java arrays sorting object

我需要在自定义对象数组上使用Arrays.binarySearch。这是对象:

class Range implements Comparable<Range>{

public int bottom;
public int top;

public Range(int botIn, int topIn) {
    this.bottom = botIn;
    this.top = topIn;
}

@Override
public int compareTo(Range compareRange) {
    int compareQuantity = ((Range) compareRange).bottom; 
    return this.bottom - compareQuantity;
}}

在我的主要内容中,我首先调用Arrays.sort(lowerBounds);,其中lowerBounds是Range元素的数组。这工作得很好,并使用我写的compareTo对它们进行排序。然后我调用Arrays.binarySearch(lowerBounds, 0),但我得到“线程中的异常”主“java.lang.ClassCastException:java.lang.Integer不能转换为compareToTest.Range”。

我做错了什么?谢谢。

编辑:这里是主要的:

public static void main(String[] args)
{
    int[] A = {1, 5, 2, 1, 4, 0};
    // write your code in Java SE 6

    Range[] lowerBounds = new Range[A.length];
    for(int i=0; i< A.length; i++)
    {
        lowerBounds[i] = new Range(i-A[i], i+A[i]);
    }

    Arrays.sort(lowerBounds);

    for(int i=0; i< A.length; i++)
    {
        System.out.println(lowerBounds[i].bottom);  
    }
    System.out.println(Arrays.binarySearch(lowerBounds, 0));   
}

2 个答案:

答案 0 :(得分:4)

Arrays.binarySearch接受两个参数 - 一个要搜索的数组,以及您要查找的对象。您提供了一个Range对象数组和一个int(自动装箱到Integer)。当然,您无法在Integer的数组中搜索Range

相反,您应该创建您正在寻找的Range对象。 E.g:

Range r = new Range (0, 0);
Arrays.binarySearch (lowerBounds, r);

答案 1 :(得分:1)

Arrays.binarySearch(lowerBounds,0)是错误的,因为您正在比较Range Objects.SO您需要传递一个Range对象而不是一个导致java.lang.ClassCastException的Integer对象:java.lang.Integer不能被强制转换to compareToTest.Range“

您需要创建一个RangeObject并将其传递给binarySearch方法

Range r = new Range(0,<any integer>)
Arrays.binarySearch (lowerBounds, r);