关于List

  说到list,我的印象就是单值集合接口,插入取出是有序的,允许重复,用他的实现类用的最频繁的就是ArrayList了。如果我现在有一个list,插入了一些值,想让里面的值按照我自定义的规则排序。

以下测试基于JDK1.7

①list里面是String的情况

 public static void main(String[] args) {
List<String> listStrs = new ArrayList<String>();
listStrs.add("aba");
listStrs.add("aba2111");
listStrs.add("aba22");
for (String s : listStrs) {
System.out.println(s);
} Collections.sort(listStrs); //排序操作 System.out.println("操作后");
for (String s : listStrs) {
System.out.println(s);
}
}
console:
aba
aba2111
aba22
操作后
aba
aba2111
aba22

从打印结果可以看出,collections.sort(listStrs);是排序了的,看下sort方法的源码

 public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}

实际上就是把list转成数组,再执行Arrays.sort(a); sort源码就不看了,我简单跟了一下,实际上它是调用了ComparableTimSort.sort方法,继续跟下去最终会把数组a 转换成 Comparable接口:Comparable<Object> pivot = (Comparable) a[start];,到这里就可以解释为什么String类实现了Comparable接口;

下面是跟踪Arrays.sort(a)的源码

接下来看看String实现了Comparable接口,是怎么实现它里面唯一的方法的

 public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value; int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}

这个方法就是定义了排序的规则,返回负数则调换这两个数的顺序,返回正数和0不管,所以从代码中可以看到优先比较字符串中的字符大小,然后比较长度,这就是String的排序规则。

② list里面是普通实体类Person的情况

 public class Person{
private String name;
private int age; public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} @Test
public void fun1() {
List<Person> listStrs = new LinkedList<Person>();
listStrs.add(new Person("zhangsan", 20));
listStrs.add(new Person("lisi", 28));
listStrs.add(new Person("wangwu", 24));
for (Person p : listStrs) {
System.out.println(p);
}
System.out.println("我排序之后:");
Collections.sort(listStrs, new Comparator<Person>() { @Override
public int compare(Person p1, Person p2) { return p1.age - p2.age;
}
}); for (Person p : listStrs) {
System.out.println(p);
}
}

我采用的是new Comparator()的方式才定义排序规则,规则比较简单,就是按照年龄升序

也可以让Person类和String类玩一个套路,让他实现Comparable接口。

 public class Person<T> implements Comparable<T>{
private String name;
private int age; public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(T o) {
if(o instanceof Integer) {
return (Integer)o - age;
}
if(o instanceof Person) {
System.out.println("是啥:" + ((Person) o).getAge() + "this是啥:" + this.getAge());
return this.age - ((Person) o).getAge();
}
return 0;
}
} @Test
public void fun2() {
List<Person> listStrs = new LinkedList<Person>();
listStrs.add(new Person("zhangsan", 20));
listStrs.add(new Person("lisi", 28));
listStrs.add(new Person("wangwu", 24));
for (Person p : listStrs) {
System.out.println(p);
}
System.out.println("我排序之后:");
Collections.sort(listStrs); for (Person p : listStrs) {
System.out.println(p);
}
}

总结:

  1 list默认是存取是有序的。

  2 要想让List按照自己定义的规则进行排序,需满足两点:① list中的元素实现Comparable接口,② Collections.sort(list)方法

  2 String类实现了Comparable接口,规则是按照字符串长度和字母a-z升序排序。

  

list元素排序需要满足两个条件的更多相关文章

  1. 《Algorithms算法》笔记:元素排序(1)——简单排序

    <Algorithms算法>元素排序(1)——简单排序 Algorithms算法元素排序1简单排序 排序问题 1 回调函数 2Java中回调函数的路线图 3 全序 4 Comparable ...

  2. Python对列表中字典元素排序

    问题起源 json对象a,b a = '{"ROAD": [{"id": 123}, {"name": "no1"}]} ...

  3. PAT 甲级 1053 Path of Equal Weight (30 分)(dfs,vector内元素排序,有一小坑点)

    1053 Path of Equal Weight (30 分)   Given a non-empty tree with root R, and with weight W​i​​ assigne ...

  4. Python小白干货宝典:sorted()函数:列表元素排序

    定义: sorted() 函数对所有可迭代的对象进行排序操作. 内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作. 语法: sorted 语法: sorted(i ...

  5. H5 60-浮动元素排序规则

    60-浮动元素排序规则 <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

  6. Python对List中的元素排序

    首先定义一个compare函数: def compare(sf1, sf2): if (sf1.value > sf2.value): return -1; elif (sf1.value == ...

  7. Atitit 如何创新 创新只有在两种条件下发生:自由、效率。

    Atitit 如何创新 创新只有在两种条件下发生:自由.效率. 创新是如何发生的呢? 创新只有在两种条件下发生:自由.效率.在自由的环境下,对效率的追逐等于创新.如果你不自由,你的思想不够开阔,你脑洞 ...

  8. SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序。

      SortedSet可自动为元素排序. SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序.   练习:自定义类用TreeSet排序. 与HashSet不同, ...

  9. 《Algorithms算法》笔记:元素排序(4)——凸包问题

    <Algorithms算法>笔记:元素排序(4)——凸包问题 Algorithms算法笔记元素排序4凸包问题 凸包问题 凸包问题的应用 凸包的几何性质 Graham 扫描算法 代码 凸包问 ...

随机推荐

  1. Spring源码从开始到放弃(一)

    参考<Spring技术内幕>分析. github上面有spring的源码(https://github.com/spring-projects/spring-framework) spri ...

  2. Struts 2再曝远程代码执行漏洞S2-037

    导读今年4月份,Apache Stuts 2之上发现的S2-033远程代码执行漏洞,以迅雷不及掩耳之势席卷而来.其利用代码很快就在短时间内迅速传播.而且官方针对这个高危漏洞的修复方案还是无效的. 悲剧 ...

  3. skeleton

    响应式模版 伯乐在线:http://hao.jobbole.com/skeleton/ cdn  : https://cdn.bootcss.com/skeleton/2.0.4/skeleton.c ...

  4. 部分常用dos命令

    Microsoft Windows XP [版本 ] (C) 版权所有 - Microsoft Corp. C:\Documents and Settings\Administrator>d: ...

  5. sort命令与cat区别

    25.1 由于sort默认是把结果按照行排序后输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile[root@shiyan a]# cat a. ...

  6. Block Formatting Contexts (块级格式化上下文) 使用参考

    转自:http://kayosite.com/block-formatting-contexts-in-detail.html 在上文<详说清除浮动>中,Kayo 较为详细地介绍了 BFC ...

  7. 170421、maven自定义变量及属性

    一.自定义变量 <!-- 全局属性配置 --> <properties> <project.build.name>tools</project.build.n ...

  8. Groovy操作符

    Groovy操作符 这一篇简单介绍一下Groovy中的操作符. 算数操作符 groovy支持java中的所有操作符,下面只列举一些groovy特有的: ** power运算符,也叫次方. assert ...

  9. Python全栈day10(基础知识练习题)

    一,执行python的两种方式 1,写在脚本里面调用python执行,例如python test.py 2,  输入python在命令行交互执行,例如 python  >>> pri ...

  10. python序列化和json

    python 的序列化和反序列化用于内存之间的共享,包括服务器和客户端的共享,两个Python程序之间的共享,以及以字符串的形式存储到硬盘中. pyhton 的pickle 可以对Python的各种数 ...