Java针对ArrayList自定义排序的2种实现方法
程序员文章站
2023-12-16 23:53:10
本文实例讲述了java针对arraylist自定义排序的2种实现方法。分享给大家供大家参考,具体如下:
java中实现对list的自定义排序主要通过两种方式
1)让需要...
本文实例讲述了java针对arraylist自定义排序的2种实现方法。分享给大家供大家参考,具体如下:
java中实现对list的自定义排序主要通过两种方式
1)让需要进行排序的对象的类实现comparable接口,重写compareto(t o)方法,在其中定义排序规则,那么就可以直接调用collections.sort()来排序对象数组
public class student implements comparable{ private int id; private int age; private int height; private string name; public student(int id, string name, int age, int height) { this.id = id; this.name = name; this.age = age; this.height = height; } public int getid() { return id; } public int getage() { return age; } public int getheight() { return height; } public string getname() { return name; } public void setid(int id) { this.id = id; } public void setage(int age) { this.age = age; } public void setname(string name) { this.name = name; } public void setheight(int height) { this.height = height; } @override public int compareto(object o) { student s = (student) o; if (this.age > s.age) { return 1; } else if (this.age < s.age) { return -1; } else { if (this.height >= s.height) { return 1; } else { return -1; } } } }
测试类:
import java.util.*; public class test { public static void printdata(list<student> list) { for (student student : list) { system.out.println("学号:" + student.getid() + " 姓名:" + student.getname() + " 年龄" + student.getage() + " 身高:" + student.getheight()); } } public static void main(string[] args) { list<student> list = new arraylist<>(); list.add(new student(1, "a", 20, 180)); list.add(new student(2, "b", 21, 175)); list.add(new student(3, "c", 22, 190)); list.add(new student(4, "d", 21, 170)); list.add(new student(5, "e", 20, 185)); system.out.println("before sorted"); printdata(list); collections.sort(list); system.out.println("after age and height sorted"); printdata(list); } }
结果:
before sorted 学号:1 姓名:a 年龄20 身高:180 学号:2 姓名:b 年龄21 身高:175 学号:3 姓名:c 年龄22 身高:190 学号:4 姓名:d 年龄21 身高:170 学号:5 姓名:e 年龄20 身高:185 after age and height sorted 学号:1 姓名:a 年龄20 身高:180 学号:5 姓名:e 年龄20 身高:185 学号:4 姓名:d 年龄21 身高:170 学号:2 姓名:b 年龄21 身高:175 学号:3 姓名:c 年龄22 身高:190
2)实现比较器接口comparator,重写compare方法,直接当做参数传进sort中
public class student { private int id; private int age; private int height; private string name; public student(int id, string name, int age, int height) { this.id = id; this.name = name; this.age = age; this.height = height; } public int getid() { return id; } public int getage() { return age; } public int getheight() { return height; } public string getname() { return name; } public void setid(int id) { this.id = id; } public void setage(int age) { this.age = age; } public void setname(string name) { this.name = name; } public void setheight(int height) { this.height = height; } }
测试类:
import java.util.*; public class test { public static void printdata(list<student> list) { for (student student : list) { system.out.println("学号:" + student.getid() + " 姓名:" + student.getname() + " 年龄" + student.getage() + " 身高:" + student.getheight()); } } public static void main(string[] args) { list<student> list = new arraylist<>(); list.add(new student(1, "a", 20, 180)); list.add(new student(2, "b", 21, 175)); list.add(new student(3, "c", 22, 190)); list.add(new student(4, "d", 21, 170)); list.add(new student(5, "e", 20, 185)); system.out.println("before sorted"); printdata(list); collections.sort(list, new comparator<student>() { @override public int compare(student o1, student o2) { if(o1.getage() >= o2.getage()) { return 1; } else { return -1; } } }); system.out.println("after age sorted"); printdata(list); collections.sort(list, new comparator<student>() { @override public int compare(student o1, student o2) { if(o1.getage() > o2.getage()) { return 1; } else if (o1.getage() < o2.getage()){ return -1; } else { if (o1.getheight() >= o2.getheight()) { return 1; } else { return -1; } } } }); system.out.println("after age and height sorted"); printdata(list); } }
输出结果:
before sorted 学号:1 姓名:a 年龄20 身高:180 学号:2 姓名:b 年龄21 身高:175 学号:3 姓名:c 年龄22 身高:190 学号:4 姓名:d 年龄21 身高:170 学号:5 姓名:e 年龄20 身高:185 after age sorted 学号:1 姓名:a 年龄20 身高:180 学号:5 姓名:e 年龄20 身高:185 学号:2 姓名:b 年龄21 身高:175 学号:4 姓名:d 年龄21 身高:170 学号:3 姓名:c 年龄22 身高:190 after age and height sorted 学号:1 姓名:a 年龄20 身高:180 学号:5 姓名:e 年龄20 身高:185 学号:4 姓名:d 年龄21 身高:170 学号:2 姓名:b 年龄21 身高:175 学号:3 姓名:c 年龄22 身高:190
单从上面的例子可以看出排序是稳定的,去看了下java的collections.sort
的源代码,确实是基于稳定的归并排序实现的,内部还做了优化,叫timsort。(关于timsort还可参考https://baike.baidu.com/item/timsort?fr=aladdin)
ps:这里再为大家推荐一款关于排序的演示工具供大家参考:
在线动画演示插入/选择/冒泡/归并/希尔/快速排序算法过程工具:
更多关于java算法相关内容感兴趣的读者可查看本站专题:《java数据结构与算法教程》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。