制作通用比较器类

Dav*_*ave 14 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;
        }
    } 
}
}
Run Code Online (Sandbox Code Playgroud)

请帮帮忙,谢谢!

Lou*_*man 25

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

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

这真的是你能做的最接近的事情:只有Comparable对象具有你想要在这里建模的"自然顺序".但是总体来说,一旦你有了Comparable对象,你不一定需要一个Comparator:例如,Collections.sort可以采取无论是ListComparator,或ListComparable元素.

  • 为了获得最佳效果,请使用`T extends Comparable <?超级T>` (4认同)

Cyr*_* Ka 5

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

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

    public int compare(T element1,T element2)
    {
        return element1.compareTo(element2);
    }
    
    Run Code Online (Sandbox Code Playgroud)

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