如何根据List中 对象的某一属性排序,比如按照学生对象的年龄属性排序。|Collections.max()|Collections.sort()

版权声明:已开启版权声明 https://blog.csdn.net/M_Kerry/article/details/81671432

本文目录

1.List相关

List 是有序的,即按照元素的添加顺序排列的,如ArrayList、LinkedList。
List是可重复的,即能存入多条完全一样的数据或对象。

2.如何取List中(基本类型)的最大值

  public static void main(String[] args){
        List list=new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        //Collections.max(list)取最大值
        System.out.print("list里最大的数字为:"+Collections.max(list);

    }
//运行结果
list里最大的数字为:3 

3.Collections.max()解析

  // 打开源码一探究竟

    public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {

        Iterator<? extends T> i = coll.iterator();
        T candidate = i.next();

        while (i.hasNext()) {
            T next = i.next();
            if (next.compareTo(candidate) > 0)
                candidate = next;
        }
        return candidate;
    }

这里写图片描述

关于 Collections这个类

1.全是静态方法,如Collections.Max(),直接通过类名.方法名调用,无需创建对象。
2.List存放基本类型的数据,用法如上。

4.如本文标题,List放学生对象,如何取最大年龄的学生

1.学生类:要实现 Comparable 这个接口,实现该接口唯一的方法。即compareTo()

public class Student  implements Comparable<Student>{
    private String name;
    int age;
    Student(){}
    Student(String name,int age){
        super();
        this.name=name;
        this.age=age;
    }
 //省略 setter和getter方法。
  @Override
    public int compareTo(Student o) {
    //注意:一定是 o.age>this.age,若 this.age在前,则排序功能无效(亲测)。
        if(o.age>this.age){
        //首次执行,o.age代表List里第一个元素,this.age是List里第二个元素
            return 1;
        }else if(o.age==this.age){
            return 0;
      }
        else{
            return -1;
        }

    }
}

2.具体比较代码

       public static void main(String[] args){
        List<Student> list=new ArrayList<>();
        list.add(new Student("张三",3));
        list.add(new Student("李六",6));
        list.add(new Student("王五",5));
        list.add(new Student("王四",4));
        System.out.println(" \n打印list中学生对象信息:");
        for(Student student : list){
            System.out.println("学生姓名:"+student.getName()+"学生年龄:"+student.getAge()); }

        //通过Collections类的sort()方法排序
        Collections.sort(list);

        //遍历
        System.out.println(" \n按照年龄降序排序之后:");
        for(Student student : list){
            System.out.println("学生姓名:"+student.getName()+"学生年龄:"+student.getAge());
        }
    }

运行结果:


    打印list中学生对象信息:
学生姓名:张三学生年龄:3
学生姓名:李六学生年龄:6
学生姓名:王五学生年龄:5
学生姓名:王四学生年龄:4

按照年龄降序排序之后:
学生姓名:李六学生年龄:6
学生姓名:王五学生年龄:5
学生姓名:王四学生年龄:4
学生姓名:张三学生年龄:3

5.Collections.sort()解析

// 按住ctrl 键飞到这个方法里,但是debug实际执行的代码确实Student实体类里的compareTo方法。
// @param  <T> the class of the objects in the list
// 意思是 Student 这个类重写了 sort 这个方法。即按照某一属性排序
// @param  list the list to be sorted.
//@see List#sort(Comparator)
// T extends Comparable ,即 Student 继承了Comparable 这个接口,
//不明白 为什么不用 implements ,Comparable明明是个接口。
  public static <T extends Comparable<? super T>> void sort(List<T> list) {
        list.sort(null);
    }

6.debug 测试Collections.sort() 究竟如何排序

  1. 依次添加的学生年龄分别为:3,6,5,4
  2. 如图处打断点,并 step Into 进去,并一直按此按钮下一步,方可看完整个比较过程。
  3. 这里写图片描述

4.可以看到进到了 Student类中的 compareTo()方法
这里写图片描述

比较值 return值
3 <6 -1
6>5 1
3<5 -1
6>5 1
5>4 1
3<4 -1

这是什么算法?
6>5比较两次?
这是debug执行的顺序,稀里糊涂的就排好序了……

等我找到具体是什么算法后再来补上

总结:

1.List里放基本元素如int,取最大值用 Collections.max(list)
2.List里放对象,根据对象的某一属性排序
①实体类要实现Comparable<实体类>接口
②重写 compareTo(T o)方法(按照某一属性比较)
③注意 o.xx>this.xx o.属性要在前
④o.xx>this.xx,return 1 则是降序排列(大的在前嘛)
o.xx=this.xx , return 0
o.xx<this.xx, return -1

猜你喜欢

转载自blog.csdn.net/M_Kerry/article/details/81671432