Java學(xué)習(xí)隨筆8
List排序
這里的list默認(rèn)是ArrayLIst
首先ArrayList有兩種sort方法械筛。一種是調(diào)用List自己的sort函數(shù)善涨,另一種是使用集合Collection的輔助類Collecetions的sort方法。但是list的sort方法不管list 中存放對(duì)象是什么驱还,都需要重寫comparator方法或者調(diào)用對(duì)象重寫的CompateTo方法朴爬。Collecetions則不然丰歌,如果list中存放的對(duì)象是Integer,String报辱,Double等特殊的對(duì)象与殃,則不需重寫comparator方法(因?yàn)檫@些基礎(chǔ)類型的包裝類和String在java源碼中已經(jīng)重寫了compareTo函數(shù))。
看下面一段代碼
List list=new ArrayList<>();
String a1="aaaaa";
String a2="assaa";
String a3="addd";
String a4="aaccc";
list.add(a1);
list.add(a2);
list.add(a3);
list.add(a4);
//list.sort(String::compareTo);
Collections.sort(list);
for(String str:list) {
System.out.println(str);
使用list.sort(String::compareTo)和Collections.sort(list)的效果是一樣的碍现,都是
aaaaa
aaccc
addd
assaa
在看一下String源碼中的compareTo函數(shù)
int compareTo(String anotherString)public int compareTo(String anotherString) {
? ? //自身對(duì)象字符串長度len1? ? int len1 = value.length;? //value指的是String的char數(shù)組幅疼,可以去看看String的完整源碼。
? ? //被比較對(duì)象字符串長度len2? ? int len2 = anotherString.value.length;
? ? //取兩個(gè)字符串長度的最小值lim? ? int lim = Math.min(len1, len2);
? ? char v1[] = value;
? ? char v2[] = anotherString.value;
? ? int k = 0;
? ? //從value的第一個(gè)字符開始到最小長度lim處為止昼接,如果字符不相等爽篷,返回自身(對(duì)象不相等處字符-被比較對(duì)象不相等字符)? ? while (k < lim) {
? ? ? ? char c1 = v1[k];
? ? ? ? char c2 = v2[k];
? ? ? ? if (c1 != c2) {
? ? ? ? ? ? return c1 - c2;
? ? ? ? }
? ? ? ? k++;
? ? }
? ? //如果前面都相等,則返回(自身長度-被比較對(duì)象長度)? ? return len1 - len2;
}
如果list中的對(duì)象是自定義的對(duì)象慢睡,那么可以重寫compareTo方法逐工。如下。
class ListNodeimplements Comparable {
????int val;
? ? ? ? ListNodenext =null;
? ? ? ? ListNode(int val) {
this.val = val;
? ? ? ? }
@Override
? ? public int compareTo(ListNode o) {
if(this.val>o.val)
return 1;
else
? ? ? ? ? ? return -1;
? ? }
}
當(dāng)然也可以在sort函數(shù)自定義比較函數(shù)(這個(gè)東西可以參考https://blog.csdn.net/yongh701/article/details/44131051)漂辐。