2018-04-26

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)。

你可能感兴趣的:(2018-04-26)