【问题标题】:Making a generic comparator class [closed]制作通用比较器类[关闭]
【发布时间】:2013-02-17 20:32:28
【问题描述】:

我正在尝试制作一个可以采用任何类型的元素进行比较的比较器。我不确定如何创建课程。我只是想让它比较两个相同类型的元素(但无论客户端给它什么类型,例如: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;
        }
    } 
}
}

请帮忙,谢谢!

【问题讨论】:

  • 对于初学者,您有几个语法错误。尝试阅读Generics in Java article。它可以让你自己解决这个问题和任何以下问题,因为它解释了什么是泛型以及如何很好地使用它们。
  • 你到底需要这个做什么?我觉得这不是你真正的问题。
  • 这是否用于用户输入的数据,例如数字、日期和字母?比较器可用于任何 Java 类,例如将一个窗口与另一个窗口进行比较,因此您的问题看起来有点宽泛,请具体说明。
  • 不合理的关闭是怎么回事?这是一个完全合法的问题,我没有看到“过于本地化”的问题。真的。

标签: java generics types comparator


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:
    1. 如果不对类型进行一些假设,就无法为所有内容编写一个比较器。您如何处理自定义类?您如何确定哪一个比另一个更大?对于更多的类,比较器没有意义。

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

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

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

    【讨论】:

      【解决方案3】:

      你可以做的最接近的事情是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 可以采用 ListComparator,或者ListComparable 元素。

      【讨论】:

      • 获得自然顺序比较器的一种方便的方法:Collections.reverseOrder(Collections.reverseOrder());
      • 为获得最佳效果,请使用T extends Comparable&lt;? super T&gt;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多