制作通用比较器类

时间:2013-03-03 19:38:21

标签: java generics types comparator

我正在尝试制作一个比较器,可以将任何类型的元素进行比较。我不确定如何创建课程。我只是想比较两个相同类型的元素(不管客户端给它的任何类型,例如:Integer,String,Double等等),看看哪一个比另一个大。

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;
        }
    } 
}
}

请帮助,谢谢!

3 个答案:

答案 0 :(得分:24)

您可以做的最接近的事情是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可以采用List使用Comparator或带有List元素的Comparable

答案 1 :(得分:5)

  1. 如果没有对类型的假设进行一些假设,就无法为所有内容编写单个比较器。你如何使用自定义类?你怎么决定哪一个大于另一个?对于野外的更多课程,比较器没有意义。

  2. 另一方面,如果你自己限制为String,Integer,Double,那么它们是可比的,你只需用compareTo()方法编写比较器:

    public int compare(T element1,T element2)
    {
        return element1.compareTo(element2);
    }
    
  3. 但是你会简单地使用元素的自然顺序,这会破坏使用比较器的目的。在这些情况下,您通常不需要一个。

答案 2 :(得分:0)

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

由于反射界面,您可以通过其类名对对象进行排序。或者甚至以某种方式通过他们的类层次结构。例如,父母之后的孩子。

或者你可以根据他们的toString()方法产生的内容对它们进行排序。或者hashCode()。毕竟,每个物体都有它们。

无论你做什么,记得要考虑任何一个元素都可以为空。

我认为我们需要知道你需要这个通用比较器。