我的程序实现了一个Product
类,其对象包含以下实例变量:name
,priority
,price
和amount
。
在LinkedList
上执行任何其他操作之前,我需要排序Product
LinkedList
个Collections.sort
个对象。
我想先按优先级排序列表(从最低到最高)。如果优先级相同,则查看价格(从最低到最高),然后是名称(按字母顺序排列)。
我已经完成了很多关于Comparable
,Comparator
和Comparable
的阅读。我相信我需要使用compareTo
接口并实现priority
方法。我的想法是因为price
,name
和Comparable
都有&#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)。
有谁知道我为什么会收到此错误并指出我正确的方向来解决它?
答案 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
方法
属性作为比较代码。