版权声明:已开启版权声明 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() 究竟如何排序
- 依次添加的学生年龄分别为:3,6,5,4
- 如图处打断点,并 step Into 进去,并一直按此按钮下一步,方可看完整个比较过程。
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