我的程序实现了一个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)。
有没有人知道我为什么会遇到这个错误,并能为我指出正确的方向来解决它?
如果您的订单仅基于数字,可比
就可以了。
但是,由于您的顺序(有时)涉及文本的词法顺序,比较器
类更好,因为使用可比
将意味着使用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
方法,该方法检查与比较代码相同的属性。
您在产品上定义的订单非常具体
所以几乎不能说“自然”。
例如,我建议定义一个常量
public static Comparator<Product> STANDARD_COMPARATOR = new Comparator<Product>() {
public int compare(Product p1, Product p1) {
return ...
}
};
然后你就可以轻松地在任何地方分类
Collections.sort(myProductList, Product.STANDARD_COMPARATOR);
当您添加其他比较器时,您的代码将以更好的方式发展。
就像您通常更喜欢组合而不是继承一样,您应该尽量避免以不变的方式定义对象的行为。
如果存在“自然”排序,请使用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