我正在研究比较器和类似接口之间的差异。
在其他网站上甚至在stackoverflow上都提到我们在需要对各个字段进行排序时使用了Comparator。
现在我正在使用像这样的可比较
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
class HDTV implements Comparable<HDTV> {
private int size;
private String brand;
private int price;
public HDTV(int size, String brand, int price) {
this.size = size;
this.brand = brand;
this.price = price;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
@Override
public int compareTo(HDTV tv) {
if (this.getSize() > tv.getSize())
return 1;
else if (this.getSize() < tv.getSize())
return -1;
else if (this.getPrice() > tv.getPrice())
return 1;
else if (this.getPrice() < tv.getPrice())
return -1;
else
return 0;
}
}
public class Test {
public static void main(String[] args) {
HDTV tv1 = new HDTV(60, "Samsung", 30000);
HDTV tv2 = new HDTV(60, "Sony", 20000);
HDTV tv3 = new HDTV(50, "LG", 20000);
List<HDTV> l = new ArrayList<>();
l.add(tv1);
l.add(tv2);
l.add(tv3);
Collections.sort(l);
Iterator it = l.iterator();
while (it.hasNext())
System.out.println(((HDTV)it.next()).getBrand());
if (tv1.compareTo(tv2) > 0) {
System.out.println(tv1.getBrand() + " is better.");
} else {
System.out.println(tv2.getBrand() + " is better.");
}
}
}
上述程序帮助我们首先对尺寸进行排序然后再按价格进行排序,这意味着我们可以使用两个参数进行排序。(根据我的理解,这是错误的)。
是的,这段代码可能是错的,但我无法弄明白。
我收到了预期的订单。
请帮我澄清一下我的疑惑。
答案 0 :(得分:1)
您在评论中引用的链接指出:
Comparable提供单一排序序列。换句话说,我们可以根据id,name或price等单个元素对集合进行排序。
VS
比较器提供多个排序顺序。换句话说,我们可以根据id,名称和价格等多个元素对集合进行排序。
这里的混淆是短语&#34;多重排序序列&#34;以及描述不正确的事实。
他们的意思是,如果您使用Comparable
接口,那么将始终根据compareTo()
方法中实现的一个序列对对象进行排序。根据对象的多个字段,序列可以像您需要的那样复杂。
使用Comparator
时,您可以动态提供归类序列,并且可以实现许多不同的Comparator
对象,这些对象以不同的方式对集合进行排序。这就是他们所说的&#34;多重排序顺序&#34;。
在这两种情况下,基于单个字段或多个字段,比较的定义可以是简单的或复杂的。使用多个Comparator
,您可以以不同的方式对对象进行排序。
在您的示例中,您可以Comparator
对品牌名称进行排序,而另一个则按价格排序,然后按尺寸排序。
至于那个网页,我会找到一个更好的网页。最好的参考始终是Oracle文档。学习阅读Javadoc,您将始终获得最佳信息。有时可能有点难以阅读,但值得投资。
答案 1 :(得分:0)
比较器和类似用途有两个不同的目的..两者都用于按照你想要的方式对物体进行排序。在上述情况下,您只能根据大小和价格对特定情况进行排序,以便对电视进行排序。
将来,如果您希望仅按价格排序...那么您必须在上述方法中更改compareTo方法。但是,您可以编写一个Comparator接口,您可以使用Collections.sort(1,new PriceComparator())
在不更改类的情况下对tv元素进行排序。希望这是一个问题。