Сравнение массива сопоставимых объектов в Java - PullRequest
3 голосов
/ 22 апреля 2011

Я хочу сравнить массив сопоставимых объектов. Простейший способ выглядит следующим образом (подробности не показаны):

public class ArrayComparable implements Comparable<ArrayComparable>{
ArrayList<Comparable<?>> list = new ArrayList<Comparable<?>>();

@Override
public int compareTo(ArrayComparable ac) {
    Iterator<Comparable<?>> itr = ac.list.iterator();
    for(Comparable<?> l : list) {
        Comparable<?> itrNext = itr.next();
        if(itrNext.getClass() == l.getClass()) {
            if(itrNext.compareTo(l)) {
                //something
            } else {
                //other stuff
            }
        } else {
            //some other thing
        }
    }
}

Конечно, проблема в том, что compareTo, как в itrNext.compareTo(l), не будет работать, выдавая ошибку: The method compareTo(capture#6-of ?) in the type Comparable<capture#6-of ?> is not applicable for the arguments (Comparable<capture#7-of ?>) что я понимаю почему (что касается метода, я мог бы сравнить яблоки с апельсинами). С другой стороны, я знаю, что я не такой, как проверяю класс вещей, прежде чем сравнивать их.

Так есть ли способ сделать эту работу? Не беспокойтесь о разумности сравнения массивов любых сопоставимых объектов, поскольку у меня есть веская причина, почему я хочу это сделать.

РЕДАКТИРОВАТЬ- ТАК, почему я хотел бы сделать что-то вроде этого. Скажем, я хотел иметь массив сопоставимых объектов, и мне было все равно, что содержится в каждом индексе, если типы соответствуют и их можно сравнивать. Тогда я мог бы сделать общее лексикографическое сравнение между этими массивами. Таким образом, мне не нужно писать сопоставимые значения для (int,int) и (int, string) и (string, double, string) или для всего, что вам нужно. Я просто пишу один, и пока я удостоверяюсь, что типы совпадают (и я могу), я в порядке.

Ответы [ 5 ]

3 голосов
/ 22 апреля 2011

Использование необработанного типа Comparable везде, где вы используете Comparable<?>, должно работать. На самом деле, вы можете просто сделать это в одном месте, если хотите:

if (((Comparable) itrNext).compareTo(l) == 0)
3 голосов
/ 22 апреля 2011

Сделайте ArrayComparable универсальным классом, чтобы вы могли правильно параметризовать универсальные классы вместо использования <?> везде. О, и вы могли бы также реализовать Iterable.

public class ArrayComparable<T> implements Comparable<ArrayComparable<T>>, Iterable<T>
{
    List<Comparable<T>> list = new ArrayList<Comparable<T>>();

    @Override
    public int compareTo(ArrayComparable<T> ac)
    {
        // snip
    }

    @Override
    public Iterator<T> iterator()
    {
        return list.iterator();
    }
}
0 голосов
/ 16 февраля 2016

Хороший ответ на это будет:

public final class ArrayComparable<T extends Comparable<T>>
    implements Comparable<ArrayComparable<T>> {

    private final ArrayList<T> list = new ArrayList<>();

    @Override
    public int compareTo(final ArrayComparable<T> other) {

        final Iterator<T> it = other.list.iterator();

        for (final T element : list) {
            final T otherElement = it.next();

            final int comparison = element.compareTo(otherElement);
            if (comparison < 0) {
                // something
            } else if (comparison > 0) {
                // other stuff
            } else {
                // other stuff
            }
        }
        return 0;
    }
}
0 голосов
/ 08 марта 2013
public class GenericDemo<T>{
  T g;
 public <T extends Comparable<T>> void printData(T a[]){
    T max = a[0];
    if(a[1].compareTo(max)>0){
        max=a[1];
    }
    if(a[2].compareTo(max)>0){
    max=a[1];
    }
    System.out.println(max);
    System.out.println("DataType: " +a.getClass().getName());

      }
    public static void main(String[] ar)
    {
     Integer a[]={1,2,3};
     Byte b[]= {4,6,7};
     Short c[]={6,8,9};

     GenericDemo g = new GenericDemo();
     g.printData(a);
     g.printData(b);
     g.printData(c);
     } 
}
0 голосов
/ 22 апреля 2011

Попробуйте это:

    if(itrNext.getClass().cast(itrNext).compareTo(l.getClass().cast(l))) {
        //something
    } else {
        //other stuff
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...