当前位置: 首页 > 知识库问答 >
问题:

决定使用可比或比较器

罗华翰
2023-03-14

我的程序实现了一个Products类,其对象包含以下实例变量:name优先级价格金额

在对链接列表执行任何其他操作之前,我需要对产品的链接列表进行排序。

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

我做了很多关于Collections.sort可比比较器的阅读。我相信我需要使用可比接口并实现一个compareTo方法。我的想法是,因为优先级价格名称都有一个“自然”排序,所以使用可比更有意义。

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

然后当我想对我的LinkedList进行排序时,我只需调用Collections.sort(LinkedList)。在我开始编写代码之前,你能告诉我我是否遗漏或忘记了什么吗?

*************更新*******************************

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

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

}

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

集合类型中的方法排序(列表、比较器)不适用于参数(LinkedList、ProductCompator)。

有没有人知道我为什么会遇到这个错误,并能为我指出正确的方向来解决它?

共有3个答案

蓬长恨
2023-03-14

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

但是,由于您的顺序(有时)涉及文本的词法顺序,比较器类更好,因为使用可比将意味着使用String.compareTo这将阻止您进行国际化。

实现比较器的单独类可以使用本地化的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;
    }
}

无论您使用可比还是比较器,明智的做法是确保Products具有equals方法,该方法检查与比较代码相同的属性。

闻枫
2023-03-14

您在产品上定义的订单非常具体

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

所以几乎不能说“自然”。

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

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

然后你就可以轻松地在任何地方分类

Collections.sort(myProductList, Product.STANDARD_COMPARATOR);

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

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

梁骞仕
2023-03-14

如果存在“自然”排序,请使用Compariable。判断顺序是否“自然”的经验法则是,对象的顺序是否总是这样。

尽管如此,是否使用Compariable或Camparator的决定并不是你需要考虑太多的决定。大多数IDE都有重构工具,可以很容易地在可比和比较器之间进行转换。因此,如果你现在选择走错了路,那么改变这一点就不需要太多的努力。

 类似资料:
  • 谁能解释一下为什么下面的代码不起作用: 但这一个有效: 换句话说,与创建普通类实例相比,接口实现何时是可互换的?当我使用compareTo()方法时会出现错误,该方法是Comparable接口的一部分,由所有包装类(如整数)实现。 所以我猜

  • 问题内容: 我有一个需要在字段上排序的对象列表,例如“分数”。我不加思索地编写了一个实现Comparator的新类,该类可以完成任务并且可以工作。 现在回头看一下,我想知道是否应该让我的类实现Comparable,而不是创建一个实现Comparator的新类。分数是订购对象的唯一字段。 我做的可接受的做法是什么? 正确的方法是“首先让类实现Comparable(用于自然排序),如果需要替代字段比较

  • 问题内容: Comparable和Comparator之间的主要区别是什么。 在什么情况下,哪个比另一个优先? 问题答案: 当你的类实现时,该类的方法将定义该对象的“自然”顺序。根据合同,该方法有义务(尽管不要求)与该对象上的其他方法保持一致,例如,当比较返回true 时,应始终为对象返回0 。 一个比较本身就是如何比较两个对象的定义,可用于可能不与自然顺序排列的方式来比较的对象。 例如,字符串通

  • 当我在浏览上面的接口时,在阅读了许多相同主题的站点后,我对这些接口的语法不是很清楚。 请考虑以下代码段: 如果每个查询都是可理解的。

  • 我的任务是用java编写mergesort,任务还规定我不能使用整数,我必须使用可比较的整数。这是我第一次使用java。我的问题是在合并函数内比较两个comp int数组中的元素。我尝试了if(list[I])compareTo(list2[j]),但compareTo只能取整数。任何帮助都将不胜感激

  • 日安- 我正在处理一个任务,在该任务中,我有指令来创建一个名为的方法,该方法将执行以下任务: public int compare(Object first,Object second)(请注意,您还可以定义:public int compare(Attory first,Attory second),方法是让类 为此,我创建了一个类,如下所示: AthletenameComparator