今天寫到關於list更具一套規則重新排序的問題。具體需求是有一個List對象,元素是Media類型,Media類有一個mediaName屬性,還有一個List<String>,存儲一組文件名,現在要求Media的list更具文件名排序,要求文件名的順序和List<String>存儲的一致。
Media類:
public class Media implements Serializable {
private static final long serialVersionUID = 1L;
private String mediaId;
private String mediaName;
private String mediaSize;
private String objectType;
private String objectId;
private String mediaType;
//getter,setter
}
這種排序當然可以通過新建一個List對象,然後遍歷List<String>文件名的方式,進行排序的操作,但是未免有些繁瑣。java爲我們提供了排序的方式。
在JDK1.7中一般使用工具類Collections(注意區分集合幾口Collection),來對集合進行排序,集合中的對象類必須實現Comparable接口的compare方法,用於比較兩個對象大小,但是這種方法只能通過比較內部的屬性的大小來進行邏輯上的判斷,通常Integer等裝箱類和String都實現了compare方法。以Integer的爲例:
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);//x>y返回1,等於返回0,小於返回-1
}
還有一種方式可以將排序規則作爲入參放在Collections.sort方法中,這樣可以引入對象外的其他參數。
Collections.sort(medias, new Comparator<MediaPojo>() {
public int compare(MediaPojo o1, MediaPojo o2){
Integer i1 = order.indexOf(o1.getMediaName()); //order表示文件名列表,在方法體外引入
Integer i2 = order.indexOf(o2.getMediaName());
return i2.compareTo(i2);
}
});
但是在JDK1.8中List增加了sort方法,入參爲排序規則,實現也很簡單
medias.sort(new Comparator<MediaPojo>() {
public int compare(MediaPojo o1, MediaPojo o2){
Integer i1 = order.indexOf(o1.getMediaName());
Integer i2 = order.indexOf(o2.getMediaName());
return i2.compareTo(i2);
}
});