3

现在,我在比较器上编写了对整数和字符串数组进行排序的文章。从代码中可以看出,如果两个类不相同,则 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;
        }
    }

}

 }

输出:

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

3 回答 3

3

我必须在 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());
    }

}

很难对未知类别进行有意义的比较。您可能需要制作一个受支持的类列表和您希望如何比较它们的显式规则。

于 2011-08-17T12:11:21.730 回答
2

如果您只想确保将课程分组在一起,您可以执行类似的操作

    ...
} else {
    return o1.getClass().getName().compareTo(o2.getClass().getName());
}
于 2011-08-17T12:09:43.830 回答
1

您始终可以比较toString()表示:

public int compare(Object o1, Object o2) {
    return o1.toString().compareTo(o2.toString());
}
于 2011-08-17T12:10:25.967 回答