我正在尝试制作一个比较器,可以将任何类型的元素进行比较。我不确定如何创建课程。我只是想比较两个相同类型的元素(不管客户端给它的任何类型,例如: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;
}
}
}
}
请帮助,谢谢!
答案 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)
如果没有对类型的假设进行一些假设,就无法为所有内容编写单个比较器。你如何使用自定义类?你怎么决定哪一个大于另一个?对于野外的更多课程,比较器没有意义。
另一方面,如果你自己限制为String,Integer,Double,那么它们是可比的,你只需用compareTo()方法编写比较器:
public int compare(T element1,T element2)
{
return element1.compareTo(element2);
}
但是你会简单地使用元素的自然顺序,这会破坏使用比较器的目的。在这些情况下,您通常不需要一个。
答案 2 :(得分:0)
我不知道这是否一定有用,但实现一个有意义的通用比较器并非不可能。
由于反射界面,您可以通过其类名对对象进行排序。或者甚至以某种方式通过他们的类层次结构。例如,父母之后的孩子。
或者你可以根据他们的toString()方法产生的内容对它们进行排序。或者hashCode()。毕竟,每个物体都有它们。
无论你做什么,记得要考虑任何一个元素都可以为空。
我认为我们需要知道你需要这个通用比较器。