Java学习随笔8
List排序
这里的list默认是ArrayLIst
首先ArrayList有两种sort方法。一种是调用List自己的sort函数,另一种是使用集合Collection的辅助类Collecetions的sort方法。但是list的sort方法不管list 中存放对象是什么,都需要重写comparator方法或者调用对象重写的CompateTo方法。Collecetions则不然,如果list中存放的对象是Integer,String,Double等特殊的对象,则不需重写comparator方法(因为这些基础类型的包装类和String在java源码中已经重写了compareTo函数)。
看下面一段代码
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函数
int compareTo(String anotherString)public int compareTo(String anotherString) {
//自身对象字符串长度len1 int len1 = value.length; //value指的是String的char数组,可以去看看String的完整源码。
//被比较对象字符串长度len2 int len2 = anotherString.value.length;
//取两个字符串长度的最小值lim int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
//从value的第一个字符开始到最小长度lim处为止,如果字符不相等,返回自身(对象不相等处字符-被比较对象不相等字符) while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
//如果前面都相等,则返回(自身长度-被比较对象长度) return len1 - len2;
}
如果list中的对象是自定义的对象,那么可以重写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;
}
}
当然也可以在sort函数自定义比较函数(这个东西可以参考https://blog.csdn.net/yongh701/article/details/44131051)。
网友评论