Как использовать CompareTo в общем массиве в Java? - PullRequest
2 голосов
/ 17 октября 2011

Я пытаюсь выяснить, как сравнить два элемента в массиве T [], вот что у меня есть:

public static <T extends Comparable< ? super T>> T getLargest(T [] a, int low, 
               int high){
    if(low>high)
            throw new IllegalArgumentException();
    T[] arrCopy = (T[]) new Object[high-low];
    for(int i=low;i<high;i++){
        if(a[i].compareTo(a[i-1])>0)
            arrCopy[i]=a[i];
        else
            arrCopy[i]=a[i+1];
    }
    return arrCopy[0];
}

, а затем я получаю ошибку: Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;

Есть идеи, как мне это решить?

Ответы [ 6 ]

5 голосов
/ 17 октября 2011

Вы можете назначить массив следующим образом:

@SuppressWarnings("unchecked")
T[] arrCopy = (T[]) Array.newInstance(a.getClass().getComponentType(), high-low);

Хотя необязательное предупреждение необходимо, это на самом деле должно быть безопасно.

Кстати, если вы хотите найти самый большой элемент вмассив, вот один onininer:

public static <T extends Comparable<T>> T max(final T[] data) {
    return Collections.max(Arrays.asList(data));
}

Для решения полной проблемы вы можете использовать один из этих двух (они эквивалентны):

public static <T extends Comparable<T>> T maxA(final T[] data,int from, int to) {
    return Collections.max(Arrays.asList(Arrays.copyOfRange(data, from, to)));
}
public static <T extends Comparable<T>> T maxB(final T[] data,int from, int to) {
    return Collections.max(Arrays.asList(data).subList(from, to));
}
2 голосов
/ 17 октября 2011

Использование:

public static <T extends Comparable<? super T>> T max(final T[] data, int fromIndex, 
               int toIndex) {
    return Collections.max(Arrays.asList(data).subList(fromIndex, toIndex));
}
2 голосов
/ 17 октября 2011

Нет оснований предполагать, что массив Object экземпляров пригоден для обработки как массив Comparable экземпляров.Вы принудительно приводите Object к T, что, как мы ожидаем, расширяет Comparable, но это непроверенное назначение здесь даже не требуется.

Вместо этого рассмотрим реализацию, которая не копирует ни одного измассив:

public static <T extends Comparable<? super T>>
T getLargest(T[] a, int first, int last)
{
  // Don't tolerate an empty range:
  if (first >= last)
    throw new IllegalArgumentException();
  // Eventually checked by subsequent use of array index operator:
  if (first < 0 || first >= a.length ||
      last < 0 || last >= a.length)
    throw new IndexOutOfBoundsException();

  T largest = a[first];
  while (++first != last)
  {
    final T candidate = a[first];
    if (candidate.compareTo(largest) > 0)
      largest = candidate;
  }
  return largest;
}

В качестве альтернативы используйте Collections#max(), предоставляя массив, рассматриваемый как List после прохождения его через Arrays#asList().

2 голосов
/ 17 октября 2011

Вы получаете ошибку здесь:

T[] arrCopy = (T[]) new Object[high-low];

Вы не можете привести материнский объект всех объектов (java.lang.object) к чему-либо, у которого java.lang.comparable является наименьшим общим знаменателем, поэтомуисключение брошено.Объект (как в java.lang.object) не реализует java.lang.comparable.

В вашем конкретном примере вам потребуется создать массив T (или, по крайней мере, java.lang).сравнимы).

2 голосов
/ 17 октября 2011

не уверен, почему вы создаете целый новый массив, когда вы заботитесь только об одном объекте, но проблема не имеет ничего общего с обобщениями. вы не можете привести Object[] к более конкретному типу, например String[], точно так же, как вы не можете написать String s = new Object().

, поскольку вы заботитесь только о самом большом значении, было бы гораздо разумнее отслеживать только одно значение (самое большое значение, замеченное до сих пор), а не весь массив.

0 голосов
/ 20 октября 2011

Просто измените new Object[high-low]; на new Comparable[high-low];. Обобщения стираются до нижней границы, поэтому T стирается до Comparable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...