Comparable并且Comparator是通过Java核心API提供了两个接口。从它们的名称中,我们可以看出它们可能以某种方式用于比较对象。但是它们到底是什么,它们之间有什么区别?以下是回答此问题的两个示例。简单的示例比较两个HDTV的大小。阅读代码后,如何使用Comparable vs. Comparator很明显。
1.可比
Comparable为了能够将自身的对象与某些其他对象进行比较,该类由类实现。类本身必须实现接口,以便能够比较其实例。实现所需的方法是compareTo()。这是一个例子:
class HDTV implements Comparable<HDTV> {
private int size;
private String brand;
public HDTV(int size, String brand) {
this.size = size;
this.brand = brand;
}
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
return 0;
}}
public class Main {
public static void main(String[] args) {
HDTV tv1 = new HDTV(55, "Samsung");
HDTV tv2 = new HDTV(60, "Sony");
if (tv1.compareTo(tv2) > 0) {
System.out.println(tv1.getBrand() + " is better.");
} else {
System.out.println(tv2.getBrand() + " is better.");
}
}}
Sony is better.
2.比较器
在某些情况下,您可能不想更改类并使其具有可比性。在这种情况下,Comparator如果要基于某些属性/字段比较对象,可以使用。例如,可以根据“身高”或“年龄”等对2个人进行比较(使用可比性无法做到)。
实现所需的方法是compare()。现在,让我们使用另一种方式来比较这些电视的尺寸。Comparator排序的一种常见用途是。无论Collections和Arrays类提供使用排序方法Comparator。
import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;
class HDTV {
private int size;
private String brand;
public HDTV(int size, String brand) {
this.size = size;
this.brand = brand;
}
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;
}}
class SizeComparator implements Comparator<HDTV> {
@Override
public int compare(HDTV tv1, HDTV tv2) {
int tv1Size = tv1.getSize();
int tv2Size = tv2.getSize();
if (tv1Size > tv2Size) {
return 1;
} else if (tv1Size < tv2Size) {
return -1;
} else {
return 0;
}
}}
public class Main {
public static void main(String[] args) {
HDTV tv1 = new HDTV(55, "Samsung");
HDTV tv2 = new HDTV(60, "Sony");
HDTV tv3 = new HDTV(42, "Panasonic");
ArrayList<HDTV> al = new ArrayList<HDTV>();
al.add(tv1);
al.add(tv2);
al.add(tv3);
Collections.sort(al, new SizeComparator());
for (HDTV a : al) {
System.out.println(a.getBrand());
}
}}
输出:
Panasonic
Samsung
Sony
通常,我们可能会使用Collections.reverseOrder()方法来获得降序比较器。如下所示:
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(3);
al.add(1);
al.add(2);System.out.println(al);Collections.sort(al);System.out.println(al);
Comparator<Integer> comparator = Collections.reverseOrder();Collections.sort(al,comparator);System.out.println(al);
输出:
[3,1,2]
[1,2,3]
[3,2,1]
3.何时使用哪个?
简而言之,实现的类Comparable将是可比较的,这意味着可以将其实例进行相互比较。
实现的类Comparator主要用于两种情况:1)可以将其传递给排序方法,例如Collections.sort()或Arrays.sort(),以精确控制排序顺序; 2)还可用于控制某些数据的顺序结构,例如排序集(例如TreeSet)或排序图(例如TreeMap)。
例如,创建一个TreeSet。我们可以将构造函数传递给比较器,也可以使对象类具有可比性。
方法1-TreeSet(比较器比较器)
class Dog {
int size;
Dog(int s) {
size = s;
}}
class SizeComparator implements Comparator<Dog> {
@Override
public int compare(Dog d1, Dog d2) {
return d1.size - d2.size;
}}
public class ImpComparable {
public static void main(String[] args) {
TreeSet<Dog> d = new TreeSet<Dog>(new SizeComparator()); // pass comparator
d.add(new Dog(1));
d.add(new Dog(2));
d.add(new Dog(1));
}}
方法2-实施可比性
class Dog implements Comparable<Dog>{
int size;
Dog(int s) {
size = s;
}
@Override
public int compareTo(Dog o) {
return o.size - this.size;
}}
public class ImpComparable {
public static void main(String[] args) {
TreeSet<Dog> d = new TreeSet<Dog>();
d.add(new Dog(1));
d.add(new Dog(2));
d.add(new Dog(1));
}}
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。