决定使用Comparable或Comparator

时间:2012-11-24 16:56:27

标签: java comparator comparable

我的程序实现了一个Product类,其对象包含以下实例变量:nameprioritypriceamount

LinkedList上执行任何其他操作之前,我需要排序Product LinkedListCollections.sort个对象。

我想先按优先级排序列表(从最低到最高)。如果优先级相同,则查看价格(从最低到最高),然后是名称(按字母顺序排列)。

我已经完成了很多关于ComparableComparatorComparable的阅读。我相信我需要使用compareTo接口并实现priority方法。我的想法是因为pricenameComparable都有&#34;自然&#34;命令使用public class Product extends ProductBase implements PrintInterface, Comparable<Product>{ private String name; private int priority; private int cents; private int quantity; // setters and getters /** * Compare current Product object with compareToThis * return 0 if priority, price and name are the same for both * return -1 if current Product is less than compareToThis * return 1 if current Product is greater than compareToThis */ @override public int compareTo(Product compareToThis) } 更有意义。

Collections.sort(LinkedList)

然后,当我想对LinkedList进行排序时,我只需要调用import java.util.Collections; public class LinkedList { private ListNode head; public LinkedList() { head = null; } // this method will sort the LinkedList using a ProductComparator public void sortList() { ListNode position = head; if (position != null) { Collections.sort(this, new ProductComparator()); } } // ListNode inner class private class ListNode { private Product item; private ListNode link; // constructor public ListNode(Product newItem, ListNode newLink) { item= newItem; link = newLink; } } 。在我开始编写代码之前,你能告诉我,如果我错过了或遗忘了什么吗?

** * ** * ** * 的**** 更新 * ** * ** * ** < EM> * ** * ** * ** * ** * ** < EM> * ** * ** *

我刚刚用比较方法创建了一个名为ProductComparator的单独类。

这是LinkedList类的一部分..

{{1}}

}

编译时,我从IDE收到以下错误。

类型集合中的方法sort(List,Comparator)不适用于参数(LinkedList,ProductComparator)。

有谁知道我为什么会收到此错误并指出我正确的方向来解决它?

3 个答案:

答案 0 :(得分:3)

如果存在“自然”排序,请使用Comparable。确定排序是否“自然”的经验法则是,对象的顺序总是是否为。

话虽如此,决定是否使用Comparable或Camparator并不是你需要过多思考的决定。大多数IDE都有重构工具,这使得Comparable和Comparator之间的转换很容易非常。因此,如果您现在选择走错路,那么改变它不需要太多努力。

答案 1 :(得分:2)

您在此处定义的订单非常具体且

  • 可能会在您的程序的未来版本中更改
  • 可能会通过上下文参数化来丰富
  • 不会涵盖新功能

所以很难说#34;自然&#34;。

我建议定义一个常量,例如

public static Comparator<Product> STANDARD_COMPARATOR = new Comparator<Product>() {
    public int compare(Product p1, Product p1) {
        return ...
    }
};

然后您就可以轻松地在任何地方进行排序

Collections.sort(myProductList, Product.STANDARD_COMPARATOR);

您的代码将以更好的方式发展,因为您将添加其他比较器。

就像你通常更喜欢组合而不是继承一样,你应该尽量避免以不可变的方式定义对象的行为。

答案 2 :(得分:0)

如果您的订单仅基于数字,Comparable就可以了。

但是,由于您的订单(有时)涉及文本的词汇顺序, Comparator类更好,因为使用Comparable意味着使用 String.compareTo会阻止您进行国际化。

实现Comparator的单独类可以使用a 用于比较字符串的本地化Collator。例如:

public class ProductComparator
implements Comparator<Product> {
    private final Collator collator;

    public ProductComparator() {
        this(Locale.getDefault());
    }

    public ProductComparator(Locale locale) {
        this.collator = Collator.getInstance(locale);
    }

    public int compare(Product product1,
                       Product product2) {

        int c = product1.getPriority() - product2.getPriority();
        if (c == 0) {
            c = product1.getPrice() - product2.getPrice();
        }
        if (c == 0) {
            c = collator.compare(product1.getName(), product2.getName());
        }
        return c;
    }
}

无论你选择Comparable还是Comparator,都是明智之举 确保Product具有检查相同的equals方法 属性作为比较代码。