2014-02-09 3 views
-1

Мне нужно использовать Arrays.binarySearch для массива пользовательских объектов. Вот объект:Java Arrays.binaryПоиск с compareTo

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; 
}} 

В моей основной I первого вызова Arrays.sort(lowerBounds); где lowerBounds является массивом элементов Range. Это работает просто отлично и сортирует их, используя compareTo, я написал. Затем я вызываю Arrays.binarySearch(lowerBounds, 0), но я получаю «Исключение в потоке» main «java.lang.ClassCastException: java.lang.Integer нельзя использовать для сравненияToTest.Range».

Что я делаю неправильно? Спасибо.

Edit: здесь главный:

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)); 
} 
+1

Где' главный() '-кода? Но мое предположение было бы попробуйте 'Arrays.binarySearch (lowerBounds, новый Range (0,0));' поскольку ключевой объект (второй параметр) имеет чтобы быть тем же типом, что и массив, в который вы проходите. –

+2

Второй параметр 'binarySearch' - это значение для поиска, поэтому он не должен быть int, а объектом« Range ». – jCoder

ответ

4

Arrays.binarySearch принимает два параметра - массив для поиска, и объект, который вы ищете. Вы предоставили массив объектов Range и int (который автобоксирован на Integer). Естественно, вы не можете найти Integer в массиве Range s.

Вместо этого вы должны создать объект Range, который вы ищите. Например:

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

Arrays.binarySearch (lowerBounds, 0) является неправильным, потому что вы сравниваете Range Objects.SO вам нужно передать объект Range вместо объекта Integer, который приводит к java.lang.ClassCastException: Java. lang.Integer не может быть приведен к compareToTest.Range»

Вам нужно создать RangeObject и передать его в методе BinarySearch

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