相同之处
实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用java.util.Arrays.sort(对象数组名称)
,可以自定义排序规则。
区别
-
1 排序规则实现的方法不同
-
Comparable
接口的方法:compareTo(Object o)
,把当前对象与o进行比较,Object为类型 -
Comparator
接口的方法:compare(T o1, T o2)
,T为类型
2 类设计前后不同
-
Comparable接口用于在类的设计中使用;
-
Comparator接口用于类设计已经完成,还想排序(Arrays);
Comparable接口实例
package Lab5;
import java.util.Arrays;
public class Compare {
public static void main(String[] args) {
// TODO 自动生成的方法存根
book [] books= {
new book("仙剑奇侠传1", 10),
new book("仙剑奇侠传2", 12),
new book("仙剑奇侠传3", 22),
new book("仙剑奇侠传4", 8),
new book("仙剑奇侠传5", 12)
};
Arrays.sort(books);
for (book b : books) {
System.out.println(b);
}
}
}
class book implements Comparable<book>{//Comparable<T>,T填需要比较的类名,这里即book
public book(String nameString,int price) {
// TODO 自动生成的构造函数存根
this.nameString=nameString;
this.price=price;
}
private String nameString;
private int price;
public String toString() {//重载toString,使得syso(bookObject)可以直接输出
return "书名为: "+nameString+" 价格为:"+price;
}
@Override
public int compareTo(book o) {//按照升序
// TODO 自动生成的方法存根
if(this.price>o.price)return 1;//当本书价格大于比较的书的价格时,放在数组后面
else if (this.price<o.price)return -1;
return 0;
}
}
Comparator接口实例
该方法需要构造一个比较器类CompareBook
package Lab5;
import java.util.Arrays;
import java.util.Comparator;
public class Compare {
public static void main(String[] args) {
// TODO 自动生成的方法存根
book [] books= {
new book("仙剑奇侠传1", 10),
new book("仙剑奇侠传2", 12),
new book("仙剑奇侠传3", 22),
new book("仙剑奇侠传4", 8),
new book("仙剑奇侠传5", 12)
};
Arrays.sort(books,new CompareBook());//使用匿名内部类对象
for (book b : books) {
System.out.println(b);
}
}
}
class book{
public book(String nameString,int price) {
// TODO 自动生成的构造函数存根
this.nameString=nameString;
this.price=price;
}
private String nameString;
private int price;
public String toString() {//重载toString,使得syso(bookObject)可以直接输出
return "书名为: "+nameString+" 价格为:"+price;
}
int getprice() {
return price;
}
}
class CompareBook implements Comparator<book>{//Comparator<T>,T填需要比较的类名,这里即book
@Override
public int compare(book o1, book o2) {
//数组顺序a1 ,a2 ,a3,...先比较a1,a2,再比较a2,a3,从小到大排序就可以理解了
//由于price是book类的私有成员,所以不能使用o1.price,需要使用o1.getprice方法
if(o1.getprice()>o2.getprice())return 1;//当o1价格大于比较的书的价格时,放在数组后面
else if (o1.getprice()<o2.getprice())return -1;
return 0;
}
}
参考资料
- https://www.cnblogs.com/qingmuchuanqi48/articles/15336178.html