很多人對list集合排序時喜歡實現(xiàn)Comparator<T>接口,自己定義排序方式,例如:
Listlist = new ArrayList<>();
list.add(1);
list.add(7);
list.add(3);
list.add(6);
list.add(5);
list.add(5);
System.out.println("排序前:");
for (int i : list) {??
? System.out.println(i);
}
Collections.sort(list, new Comparator() {?
??public int compare(Integer o1, Integer o2) {??
? ? ? return o1-o2;? ? }
});
System.out.println("排序后:");
for (int i : list) {? ? System.out.println(i);}
輸出信息:
排序前:
1
7
3
6
5
5
排序后:
1
3
5
5
6
7
這樣沒有問題,但是如果int換成long呢?只有改成這樣:
Collections.sort(list, new Comparator() {? ??
public int compare(Long l1, Long l2) {?
?? ? ? return (int) (l1-l2);? ? }
});
輸出信息:
排序前:
1
7
3
6
5
5
排序后:
1
3
5
5
6
7
這樣看上去也沒有問題,但是如果long的數(shù)值過大呢?比如數(shù)據(jù)添加兩行:
Listlist = new ArrayList<>();
list.add(1L);
list.add(7L);
list.add(3L);
list.add(6L);
list.add(5L);
list.add(5L);
list.add(1247189571876180L);
list.add(52856189568195L);
然而打印便成了這樣:
排序前:
1
7
3
6
5
5
1247189571876180
52856189568195
排序后:
52856189568195
1247189571876180
1
3
5
5
6
7
這是為什么呢?這是因為52856189568195這樣的數(shù)字與1這樣的數(shù)字做減法運(yùn)算后他的數(shù)值超過了int的范圍,做強(qiáng)轉(zhuǎn)時造成了數(shù)據(jù)丟失,所以我們這樣做減法再強(qiáng)轉(zhuǎn)的方式明顯不可取,所以我們可以用這樣的方式去解決這個問題:
Collections.sort(list, new Comparator() {
public int compare(Long l1, Long l2) {
? ? ? ? return Long.compare(l1,l2);? ??
});
打印信息便正常了:
排序前:
1
7
3
6
5
5
1247189571876180
52856189568195
排序后:
1
3
5
5
6
7
52856189568195
1247189571876180
這個方法不是Long獨(dú)有的,Integer,Double甚至String都有,這個方法也可以寫成這樣:l1.compareTo(l2),特別注意的是String,它沒有compare方法,只有compareTo方法,為什么使用這個方法就可以避免數(shù)據(jù)丟失呢?我們來看源碼:
public static int compare(long x, long y) {
? ? return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
public int compareTo(Long anotherLong) {
? ? return compare(this.value, anotherLong.value);
}
源碼中沒有進(jìn)行強(qiáng)轉(zhuǎn),用的是一個三元運(yùn)算符,這個相信大家都看得懂,屬于java基礎(chǔ)內(nèi)容,我就不獻(xiàn)丑去解釋了,到這里就會有人說了,我為什么要用差距這么大數(shù)去排序呢?emmm...別急,繼續(xù)往下看:
有這么一個較復(fù)雜的數(shù)據(jù):
public class TestBean {
? ? private int id;
? ? private String name;
? ? private Date createDate;
? ? private Date updateDate;
? ? public TestBean(int id, String name, Date createDate, Date updateDate) {
? ? ? ? this.id = id;
? ? ? ? this.name = name;
? ? ? ? this.createDate = createDate;
? ? ? ? this.updateDate = updateDate;
? ? }
}
我們想對它進(jìn)行排序,按創(chuàng)建時間排序,創(chuàng)建時間一樣按姓名排序,我們就可以這么寫:
Listlist = new ArrayList<>();list.add(new TestBean(1,"德瑪西亞劉德華",new Date(0),new Date(0)));list.add(new TestBean(2,"艾歐里亞張學(xué)友",new Date(System.currentTimeMillis()),new Date(0)));
list.add(new TestBean(3,"諾克薩斯彭于晏",new Date(1213846185668L),new Date(0)));
list.add(new TestBean(4,"弗雷爾卓德黎明",new Date(13575917L),new Date(0)));
list.add(new TestBean(5,"皮城美少女戰(zhàn)士",new Date(13575917L),new Date(0)));
System.out.println("排序前:");
for (TestBean b : list) {?
?? System.out.println(b.toString());
}
Collections.sort(list, new Comparator() {
?public int compare(TestBean b1, TestBean b2) {
? ? ? ? if (b1.getCreateDate().getTime()-b2.getCreateDate().getTime()!=0){? ?
?? ? ? ? return Long.compare(b1.getCreateDate().getTime(),b2.getCreateDate().getTime());? ? ? ??
}else {? ? ? ? ? ??
return b1.getName().compareTo(b2.getName());? ? ? ??
}
}});
System.out.println("排序后:");
for (TestBean i : list) {
? ? System.out.println(i.toString());
}
打印信息為:
排序前:
TestBean{id=1, name='德瑪西亞劉德華', createDate=Thu Jan 01 08:00:00 CST 1970, updateDate=Thu Jan 01 08:00:00 CST 1970}
TestBean{id=2, name='艾歐里亞張學(xué)友', createDate=Tue Dec 11 22:36:01 CST 2018, updateDate=Thu Jan 01 08:00:00 CST 1970}
TestBean{id=3, name='諾克薩斯彭于晏', createDate=Thu Jun 19 11:29:45 CST 2008, updateDate=Thu Jan 01 08:00:00 CST 1970}
TestBean{id=4, name='弗雷爾卓德黎明', createDate=Thu Jan 01 11:46:15 CST 1970, updateDate=Thu Jan 01 08:00:00 CST 1970}
TestBean{id=5, name='皮城美少女戰(zhàn)士', createDate=Thu Jan 01 11:46:15 CST 1970, updateDate=Thu Jan 01 08:00:00 CST 1970}
排序后:
TestBean{id=1, name='德瑪西亞劉德華', createDate=Thu Jan 01 08:00:00 CST 1970, updateDate=Thu Jan 01 08:00:00 CST 1970}
TestBean{id=4, name='弗雷爾卓德黎明', createDate=Thu Jan 01 11:46:15 CST 1970, updateDate=Thu Jan 01 08:00:00 CST 1970}
TestBean{id=5, name='皮城美少女戰(zhàn)士', createDate=Thu Jan 01 11:46:15 CST 1970, updateDate=Thu Jan 01 08:00:00 CST 1970}
TestBean{id=3, name='諾克薩斯彭于晏', createDate=Thu Jun 19 11:29:45 CST 2008, updateDate=Thu Jan 01 08:00:00 CST 1970}
TestBean{id=2, name='艾歐里亞張學(xué)友', createDate=Tue Dec 11 22:36:01 CST 2018, updateDate=Thu Jan 01 08:00:00 CST 1970}
你們看,這樣不但代碼簡潔,而且出現(xiàn)錯誤的幾率也更小是不是?本人也是個新人程序員,說的不對的地方大家可以指正,希望我們可以一起努力,早日成為大家都想成為的大神!加油,(=?ω?)? ---===≡≡≡
大家看不清楚可以去我在CSDN發(fā)的文章https://blog.csdn.net/tp19970424/article/details/84962584,因為懶,所以我是粘貼復(fù)制的,不想再打一遍了...