16

我正在尝试制作一个可以比较任何类型的元素的比较器。我不确定如何创建课程。我只是想让它比较相同类型的两个元素(但无论客户端给它什么类型,例如:整数、字符串、双精度等),看看哪个比另一个更大。

public class InsertionComparator implements Comparator<T>
{
/**
 * Compares two elements.
 * 
 * @param  f1  The first element you want to compare.
 * @param  f2  The second element you want to compare.
 * @return  -1,0,1  Whether or not one is greater than, less than,
 * or equal to one another.
 */
public int compare(<T> element1,<T> element2)
{
    if(element1 < element2)
    {
        return -1;
    }
    else
    {
        if(element1 > element2)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    } 
}
}

请帮忙,谢谢!

4

3 回答 3

28

您可以做的最接近的事情是Comparator可以比较任何实现该Comparable接口的对象:

class NaturalComparator<T extends Comparable<T>> implements Comparator<T> {
  public int compare(T a, T b) {
    return a.compareTo(b);
  }
}

这确实是您可以做的最接近的事情:只有Comparable对象具有您要在此处建模的“自然顺序”。但一般来说,一旦有了Comparable对象,就不一定需要Comparator: 例如,Collections.sort可以使用 a和ListaComparator或 aListComparable元素。

于 2013-03-03T19:41:58.707 回答
5
  1. 如果不对类型进行一些假设,就无法为所有内容编写单个比较器。您如何处理自定义类?您如何确定哪一个比另一个更大?对于野外的更多类,比较器没有意义。

  2. 另一方面,如果您将自己限制为 String、Integer、Double,那么它们是 Comparable 并且您可以简单地使用 compareTo() 方法编写比较器:

    public int compare(T element1,T element2)
    {
        return element1.compareTo(element2);
    }
    

但是你会简单地使用元素的自然顺序,它会破坏使用比较器的目的。在这些情况下,您通常不需要一个。

于 2013-03-03T19:43:39.827 回答
0

我不知道这是否一定有用,但不可能实现有意义的通用比较器。

多亏了反射接口,例如,您可以按对象的类名对对象进行排序。或者甚至可能以某种方式通过他们的类层次结构。例如,父母之后的孩子。

或者您可以根据他们的 toString() 方法产生的内容对它们进行排序。或哈希码()。毕竟,每个对象都有它们。

无论您做什么,请记住考虑任何一个元素都可能为空。

我想我们需要知道你需要这个通用比较器做什么。

于 2013-03-03T19:49:47.760 回答