Comparable vs Comparator in Java

原文Comparable vs Comparator in Java

Comparable 和 Comparator 是java core API 提供的2个接口,从名称上可以看出,它们是用某种方式来比较的。下面通过例子来演示什么情况下用它们,以及它们之间的区别。

1,Comparable

一个类实现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;} @Overridepublic int compareTo(HDTV tv) { if (this.getSize() > tv.getSize())return 1;else if (this.getSize() < tv.getSize())return -1;elsereturn 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

当对象比较要基于不同属性时,Comparator可以胜任该工作。需要实现的方法是compare(),Comparator通常用于排序(sorted),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> {@Overridepublic 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());}}}
PanasonicSamsungSony

我们经常用Collections.reverseOrder()来获取一个降序的Comparator

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,When to use Which

简单的说,一个实现了Comparable的类就可以进行比较了,它自身就可以和其他对象比较。

实现了Comparator的类可以作为其它类的比较器。1)可以用作一些sort()方法的参数,比如,Collections.sort(),和Arrays.sort(),可以更精确的控制排序的顺序。2)可以控制一定的数据结构,比如sorted Set,和sorted Map.

比如,创建一个TreeSet,可以将一个Comparator传参,也可以将类实现Comparable。

实现一:Comparator

class Dog {int size; Dog(int s) {size = s;}} class SizeComparator implements Comparator<Dog> {@Overridepublic 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 comparatord.add(new Dog(1));d.add(new Dog(2));d.add(new Dog(1));}}

实现二:实现Comparable

class Dog implements Comparable<Dog>{int size; Dog(int s) {size = s;} @Overridepublic 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));}}

天才是百分之一的灵感加上百分之久十久的努力

Comparable vs Comparator in Java

相关文章:

你感兴趣的文章:

标签云: