Java使用Arrays.sort()方法給物件排序
當我們給一個整型陣列或者浮點型之類的陣列排序的時候,很簡單就可以達到我們排序的目的,無非是排序演算法的問題。那麼,如果我們現在想根據物件的一個屬性值給一個物件陣列進行排序呢?
假如我們現在有一個Car型別,Car類中有一個double型的speed屬性用來描述車輛的速度,現在我們想根據車速來對一個Car陣列中的車輛進行排序,怎麼做呢?
public class Car{
private double speed;//車輛的速度屬性
public Car(double speed) {
this.speed = speed;
}
public double getSpeed () {
return speed;
}
public void setSpeed(double speed) {
this.speed = speed;
}
}
麻煩的方法
我們可以通過比較物件的屬性值,根據比較結果,對物件陣列進行排序,例如,假如我們使用的是氣泡排序的話,就需要寫成下面這樣:
for(int i=0;i<a.length-1;i++)//a為一個儲存了很多Car物件的陣列
{
for(int j=0;j<a.length-i-1;j++)
{
if(a[j].getSpeed()>a[j+1].getSpeed())//交換操作
{
Car temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
這樣寫確實能實現了效果,但是未必效能很好,由於是自己寫的,寫起來也會比較麻煩,下面的方法會更好
Arrays.sort()方法
我們先來看看用Array.sort()方法實現對車輛排序的程式碼:
其中,Car這個類有兩種寫法:
第一種寫法:
public class Car implements Comparable<Car>{
private double speed;
public Car(double speed) {
this .speed = speed;
}
public double getSpeed() {
return speed;
}
public void setSpeed(double speed) {
this.speed = speed;
}
@Override
public int compareTo(Car newCar) {
return Double.compare(this.getSpeed(),newCar.getSpeed());
}
}
第二種寫法
public class Car implements Comparable{
private double speed;
public Car(double speed) {
this.speed = speed;
}
public double getSpeed() {
return speed;
}
public void setSpeed(double speed) {
this.speed = speed;
}
@Override
public int compareTo(Object newCar) {
return Double.compare(this.getSpeed(),((Car)newCar).getSpeed());
}
}
main方法:
public class Test8 {
public static void main(String[] args) {
Car[] carList = new Car[3];
carList[0] = new Car(30);
carList[1] = new Car(10);
carList[2] = new Car(55);
Arrays.sort(carList);
for(Car c:carList)
{
System.out.println(c.getSpeed());
}
}
}
輸出結果:
解析:
顧名思義,Arrays類的sort()方法是對一個數組進行排序的方法,sort()方法的引數是一個物件陣列,也就是要排序的那個陣列,但是有些特別的是,這個物件陣列中儲存的物件的類必須實現了Comparable介面。
Comparable介面是用來比較大小的,要實現這個介面,我們必須重寫介面中的CompareTo()方法,這個方法用來比較兩個物件的大小,因為方法本身並不知道我我們會根據物件的哪個屬性來比較兩個物件的大小,因此在這個方法中,我們可以定義我們自己的比較規則。
在上述的程式碼中,我們呼叫了Double類的比較方法來比較兩個物件的speed屬性的大小,如果呼叫方法的Car物件的speed屬性值比方法引數傳進來的Car物件的speed值大就返回1,相等就返回0,小於就返回-1。當然,我們也可以自己手寫這個部分,無非就是if else判斷的事。
之所以有兩種寫法,是因為第一種使用了泛型,第二種使用了物件的強制轉換,可以看到,當我們使用泛型的時候,在呼叫物件的時候就已經確定了使用介面的時候用的是哪一種物件,因此就不用把物件型別強制轉換為我們想要的型別了。而第二種我們沒有使用泛型,因此就需要把引數傳進來的物件強制轉換成我們想要的型別然後再進行操作。推薦使用第一種寫法。
接下來,我們在main方法中構建了一個Car型別的陣列,然後直接呼叫Arrays.sort()方法傳進陣列作為引數就可以對陣列進行排序了。
這種方法比較方便,快捷,在效能方面也有不錯的表現,本人親測在排序20萬個物件的時候花費差不多200ms左右的時間。
當然,這種方法主要圖的是方便,當我們需要排序大量的資料的時候,還是應該結合自己資料的特性來具體選擇一種排序方式自己寫。