java中的比較排序
阿新 • • 發佈:2019-02-13
java中的Comparator和Comparable比較器的用法
Comparable和Comparator都是用來實現集合中的排序的,Comparator位於包Java.util下,而Comparable位於包java.lang下,Comparable是一個物件本身就已經支援自比較所需要實現的介面(如 String、Integer 自己就可以完成比較大小操作),是內部定義的排序;而後者在一個獨立的類中實現比較,是外部實現的排序。 如果一個類沒有實現Comparable介面,或是這個物件不支援自比較或者自比較函式不能滿足你的要求時,可以通過Comparator來實現比較演算法進行排序,並且為了使用不同的排序標準做準備,比如:升序、降序。所以,如想實現排序,就需要讓類物件自身實現Comparable介面,重寫其中的compareTo(T o)方法;或在外部定義比較器實現Comparator介面,重寫其compare(T o1,T o2)方法。前者只有一個引數,後者有兩個引數。排序時可以呼叫java.util.Arrays.sort()來排序物件陣列,或是呼叫集合中的sort()方法就可以按照相應的排序方法進行排序。方法返回一個基本型別的整型,返回負數表示o1小於o2,返回0表示o1和o2相等,返回正數表示o1大於o2。
用 Comparator 是策略模式(strategy design pattern),就是不改變物件自身,而用一個策略物件(strategy object)來改變它的行為。比如:你想對整數採用絕對值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實際上你也不能這麼做)去改變它的排序行為,只要使用一個實現了Comparator介面的物件來實現控制它的排序就行了。
java.util.Arrays和java.util.Collections(注意和Collection的區別)Collection是集合框架的頂層介面,而Collections是包含了許多靜態方法。我們使用Arrays對陣列進行排序,使用Collections對結合框架容器進行排序,如ArraysList,LinkedList等
import java.util.Arrays;
import java.util.Comparator;
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
@Override
public String toString() {
return ""+this.name+" "+this.age;
}
@Override
public int compareTo(Person o) {
if (this.getName().compareTo(o.getName()) != 0)
return this.getName().compareTo(o.getName());
else {
if (this.getAge() < o.getAge())
return -1;
else if (this.getAge() > o.getAge())
return 1;
else return 0;
}
}
}
class Cmp implements Comparator {
@Override
public int compare(Object arg0, Object arg1) {
Person a = (Person) arg0;
Person b = (Person) arg1;
if (a.getName().compareTo(b.getName()) != 0)
return a.getName().compareTo(b.getName());
else {
if (a.getAge() < b.getAge())
return -1;
else if (a.getAge() > b.getAge())
return 1;
else return 0;
}
}
}
public class Main {
public static void main(String[] args) {
Person[] p = new Person[4];
p[0] = new Person("ZZZ",19);
p[1] = new Person("AAA", 109);
p[2] = new Person("AAA", 19);
p[3] = new Person("YYY",100);
// Arrays.sort(p);//呼叫自有的排序
Arrays.sort(p, new Cmp());//呼叫Comparator定義的排序
System.out.println(Arrays.toString(p));
}
}
ArrayList<ErrLog> list = new ArrayList<ErrLog>(hashMap.values());
// 根據 錯誤次數比較,將錯誤次數多的放前面,如果錯誤次數一致,將出現順序早的放到前面 進行排序
Comparator<ErrLog> cmp = new Comparator<ErrLog>() {
@Override
public int compare(ErrLog o1, ErrLog o2) {
return o2.size - o1.size == 0 ? (o1.queueMark - o2.queueMark)
: o2.size - o1.size;
}
};
Collections.sort(list, cmp);