Как сравнить на нескольких классах в Java? - PullRequest
3 голосов
/ 17 августа 2011

Прямо сейчас я написал в компараторе, который сортирует массив целых чисел и строк.Как видно из кода, если два класса не совпадают, класс String принимает значение больше, чем значение.Однако это позволяет только два класса.Что, если я хочу добавить еще один примитивный тип в мой массив, например, Float?Я должен был бы добавить больше кода в оператор if-else.Есть ли способ реализовать сравнение без добавления оператора для каждого дополнительного класса, который я хочу сравнить?

import java.util.Arrays;
import java.util.Comparator;

public class SampleComparator implements Comparator<Object> {

public static void main(String[] args) {
    Object[] inputData = { new String("pizza"), new Integer(0),
            new String("apples"), new Integer(5), new String("pizza"),
            new Integer(3), new Integer(7), new Integer(5) };
    Arrays.sort(inputData, new SampleComparator());
    System.out.println(Arrays.asList(inputData));
}

public int compare(Object o1, Object o2) {
    if (o1.getClass().equals(o2.getClass())) {
        return ((Comparable)o1).compareTo((Comparable)o2);
    } else {
        if(o1.getClass().getCanonicalName().equals("java.lang.String")){
            return 1;
        } else {
            return -1;
        }
    }

}

 }

output:

[0, 3, 5, 5, 7, apples, pizza, pizza]

Ответы [ 3 ]

3 голосов
/ 17 августа 2011

Мне нужно добавить больше кода в оператор if-else. Есть ли способ реализовать сравнение без добавления оператора для каждого дополнительного класса, который я хочу сравнить?

Вы, вероятно, хотите сравнить объекты одного и того же класса, используя их собственные компараторы, и затем иметь некоторый порядок в классах (например, все целые числа перед всеми числами с плавающей точкой перед всеми строками).

Таким образом, вы можете сначала сравнить классы, а затем, если они равны, сравнить объекты.

public int compare(Object o1, Object o2) {
    // maybe some null checks here?

    if (o1.getClass().equals(o2.getClass())) {
        // and what if they are not Comparable ?
        return ((Comparable)o1).compareTo((Comparable)o2);
    } else {
        // for example compare by class name alphabetically
        // another idea would be a map with all supported classes,
        // assigning them an order

        return o1.getClass().getName().compareTo(o2.getClass().getName());
    }

}

Будет сложно придумать содержательное сравнение неизвестных классов. Вам, вероятно, нужно составить список поддерживаемых классов и явных правил, как вы хотите их сравнивать.

2 голосов
/ 17 августа 2011

Если вы просто хотите объединить классы вместе, вы можете сделать что-то вроде

    ...
} else {
    return o1.getClass().getName().compareTo(o2.getClass().getName());
}
1 голос
/ 17 августа 2011

Вы всегда можете сравнить представление toString():

public int compare(Object o1, Object o2) {
    return o1.toString().compareTo(o2.toString());
}
...