Comparable
自然排序
Comparable
接口排序方式称为 自然排序。实现Comparable
接口的类必须实现compareTo()
方法:
public class CompareTest implements Comparable<T>{
@Override
public int compareTo(T t){}
}
a.compareTo(b)
返回1
,系统认为a>b
;a.compareTo(b)
返回-1
,系统认为a<b
;a.compareTo(b)
返回0
,系统认为a=b
。可以改变重写内容使得系统认为a>b
,而实际上b>a
。
数组的自然排序
使用Arrays.sort()
方法可实现数组的自然排序。
public static void sort(Object[] a) {}
对于自然排序方法,sort()
按照 系统认为的 从小到大 进行排序,即compareTo()
返回-1
的排在之前,compareTo()
返回1
的排在之后,compareTo()
返回0
则按照其它规则排序。
Person.java
public class Person implements Comparable<Person> {
private String name;
private float height;
private int weight;
public Person(String name,float height,int weight){
this.name = name;
this.height = height;
this.weight = weight;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setHeight(float height){
this.height = height;
}
public float getHeight(){
return this.height;
}
public void setWeight(int weight){
this.weight = weight;
}
public int getWeight(){
return this.weight;
}
@Override
public int compareTo(Person person){
if(this.getHeight() > person.getHeight()) return 1;
else if(this.getHeight() < person.getHeight()) return -1;
else {
if(this.getWeight() > person.getWeight()) return 1;
else if(this.getWeight() < person.getWeight()) return -1;
else return this.getName().compareTo(person.getName());
}
}
}
Main.java
public class Main {
public static void main(String[] args) {
Person[] persons = new Person[5];
persons[0] = new Person("Tony",1.75f,130);
persons[1] = new Person("Anna",1.70f,120);
persons[2] = new Person("Steve",1.75f,120);
persons[3] = new Person("Jerry",1.74f,115);
persons[4] = new Person("Lucy",1.70f,120);
Arrays.sort(persons);
for(Person person : persons) {
System.out.println(person.getName()+" "
+person.getHeight()+"m "
+person.getWeight()+"(1/2Kg)");
}
}
}
运行结果:
Anna 1.7m 120(1/2Kg)
Lucy 1.7m 120(1/2Kg)
Jerry 1.74m 115(1/2Kg)
Steve 1.75m 120(1/2Kg)
Tony 1.75m 130(1/2Kg)
Comparator
定制排序
Comparator
接口排序方式称为 定制排序。实现Comparator
的类必须实现compare()
方法:
public class CompareTest implements Comparator<T> {
@Override
public int compare(T t1,T t2) {}
}
Comparator
与Comparable
的区别在于:
使用Comparable
接口实现排序依赖于需要排序的类,排序的规则(从大到小还是从小到大)在需要排序的类内部制定。因此实现Comparable
接口的类一旦制定排序规则(从大到小还是从小到大)在使用中就不能改变。
使用Comparator
接口实现排序不依赖于需要排序的类,排序的规则(从大到小还是从小到大)可以在需要排序的类外部制定。因此对于Comparator
接口排序方式,常使用匿名内部类实现。
Arrays.sort(persons,new Comparator<Person>(){
@Override
public int compare(Person p1,Person p2) {}
});
compare()
返回1
系统认为p1>p2
,compare()
返回-1
系统认为p1<p2
,compare()
返回0
系统认为p1=p2
。sort()
方法按照 系统认为 的 从小到大 进行排序,即compare()
返回-1
的排在之前,compare()
返回1
的排在之后,compare()
返回0
则按照其它规则排序。
数组的定制排序
Person.java
public class Person {
private String name;
private float height;
private int weight;
public Person(String name,float height,int weight){
this.name = name;
this.height = height;
this.weight = weight;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setHeight(float height){
this.height = height;
}
public float getHeight(){
return this.height;
}
public void setWeight(int weight){
this.weight = weight;
}
public int getWeight(){
return this.weight;
}
}
Main.java
public class Main {
public static void main(String[] args) {
Person[] persons = new Person[5];
persons[0] = new Person("Tony",1.75f,130);
persons[1] = new Person("Anna",1.70f,120);
persons[2] = new Person("Steve",1.75f,120);
persons[3] = new Person("Jerry",1.74f,115);
persons[4] = new Person("Lucy",1.70f,120);
//从小到大排序
Arrays.sort(persons,new Comparator<Person>(){
@Override
public int compare(Person p1,Person p2){
if(p1.getHeight() > p2.getHeight()) return 1;
else if(p1.getHeight() < p2.getHeight()) return -1;
else {
if(p1.getWeight() > p2.getWeight()) return 1;
else if(p1.getWeight() < p2.getWeight()) return -1;
else return p1.getName().compareTo(p2.getName());
}
}
});
for(Person person : persons) {
System.out.println(person.getName()+" "
+person.getHeight()+"m "
+person.getWeight()+"(1/2Kg)");
}
System.out.println();
//从大到小排序
Arrays.sort(persons,new Comparator<Person>(){
@Override
public int compare(Person p1,Person p2){
if(p1.getHeight() > p2.getHeight()) return -1;
else if(p1.getHeight() < p2.getHeight()) return 1;
else {
if(p1.getWeight() > p2.getWeight()) return -1;
else if(p1.getWeight() < p2.getWeight()) return 1;
else return -(p1.getName().compareTo(p2.getName()));
}
}
});
for(Person person : persons) {
System.out.println(person.getName()+" "
+person.getHeight()+"m "
+person.getWeight()+"(1/2Kg)");
}
}
}
运行结果:
Anna 1.7m 120(1/2Kg)
Lucy 1.7m 120(1/2Kg)
Jerry 1.74m 115(1/2Kg)
Steve 1.75m 120(1/2Kg)
Tony 1.75m 130(1/2Kg)
Tony 1.75m 130(1/2Kg)
Steve 1.75m 120(1/2Kg)
Jerry 1.74m 115(1/2Kg)
Lucy 1.7m 120(1/2Kg)
Anna 1.7m 120(1/2Kg)