Collections之sort、reverse
在使用List集合时,通常情况下希望从集合中得到的对象是按照一定顺序排列的,但是List集合的默认排序方式为按照对象的插入顺序,可以通过java.util.Collections类的静态方法sort(List<T> list)、sort(List<T> list,Comparator<? super T> c)或reverse(List<?> list)对集合中的对象进行客户化排序,其中方法sort(List<T> list)和reverse(List<?> list)要求集合中的对象必须实现java.lang.Comparable接口,即实现方法compareTo(),该方法的具体定义如下:
public int compareTo(T o);
方法sort(List<T> list)是将集合中的所有对象按正序排列,方法reverse(List<?> list)是将集合中的所有对象按倒序排列;方法sort(List<T> list,Comparator<? super T> c)不要求集合中的对象必须实现Comparable接口,但是在使用该方法时需要显式设置比较器,即该方法的第2个入口参数,比较器必须实现java.util.Comparator接口,即实现方法compare(),该方法的就具体定义如下:
int compare(T o1,T o2);
比较器的功能是实现对集合中所有对象的排序策略。
注意:List集合进行客户化排序的前提条件是List集合中的元素为同一类型。
1、通过实现java.lang.Comparable接口实现客户化排序
实体类:
public class Person implements Comparable{ //实现接口Comparable
private String name;
private long id_card;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public long getId_card(){
return id_card;
}
public void setId_card(long id_card){
this.id_card = id_card;
}
public int compareTo(Object o){//实现Comparable接口的方法
Person p = (Person)o;
String s1 = CnToSpell.getFullSpell(this.name);//获得汉字的全拼
String s2 = CnToSpell.getFullSpell(p.getName());
return s1.compareTo(s2);//比较两个字符串的大小
}
}
测试类:
import java.util.*;
public class TestList{
public static void main(String args[]){
List<Person> list = new ArrayList<Person>();
String names[] = {"马先生","王小姐","李先生"};
long id_cards[] ={22015,22020,22018};
for(int i=0;i<names.length;i++){//初始化List集合
Person person = new Person();
person.setName(names[i]);
person.setId_card(id_cards[i]);
list.add(person);
}
System.out.println("排序前:");
for(int i=0;i<list.size();i++){//遍历List集合
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
//利用java.util.Collections类的sort(List list)或reverse(List list)方法对List集合排序
Collections.sort(list);//按升序排序
System.out.println("升序排列后:");
for(int i=0;i<list.size();i++){//遍历List集合
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
Collections.reverse(list);//按降序排列
System.out.println("降序排列后:");
for(int i=0;i<list.size();i++){//遍历List集合
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
}
}
程序的运行结果如下:
排序前:
-----马先生 22015
-----王小姐 22020
-----李先生 22018
升序排列后:
-----李先生 22018
-----马先生 22015
-----王小姐 22020
降序排列后:
-----王小姐 22020
-----马先生 22015
-----李先生 22018
利用这种方式实现对List集合进行客户化排序,缺点是对于每个类只能采用一种排序方式,对于排序方式需求单一的对象,可采用该种方式。
2、通过实现java.util.Comparator接口实现客户化排序
public class Person{
private String name;
private long id_card;
public long getId_card(){
return id_card;
}
public void setId_card(long id_card){
this.id_card = id_card;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
import java.util.Comparator;
public class PersonComparator implements Comparator{
//为可能参与排序的属性定义同名的静态常量值
public static final int NAME = 1;
public static final int ID_CARD = 2;
private int orderByColumn = 1;//默认排序为按姓名排序
public int compare(Object o1,Object o2){//实现Comparator接口的方法
Person p1 = (Person)o1;
Person p2 = (Person)o2;
int result = 0;//默认的判断结果为两个对象相等
switch(orderByColumn){//判断排序条件
case 1://按姓名排序
String s1 = CnToSpell.getFullSpell(p1.getName());//获得汉字的全拼
String s2 = CnToSpell.getFullSpell(p2.getName());
result = s1.compareTo(s2);//比较两个字符串的大小
break;
case 2:
result = (int)(p1.getId_card()-p2.getId_card());//比较两个整数的大小
break;
}
return result;
}
public void orderByColumn(int orderByColumn){//用来设置排序条件
this.orderByColumn = orderByColumn;
}
}
public class TestList{
public static void main(String args[]){
List<Person> list = new ArrayList<Person>();
String names[] ={"马先生","王小姐","李先生"};
long id_cards[] = {22015,22020,22018};
for(int i= 0;i<names.length;i++){
Person person = new Person();
person.setName(names[i]);
person.setId_card(id_cards[i]);
list.add(person);
}
System.out.println("排序前:");
for(int i=0;i<list.size();i++){
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
PersonComparator personComparator = new PersonComparator();//创建比较器对象
System.out.println("按姓名排序:");
Collections.sort(list,personComparator);//默认为按姓名排序,排序List集合
for(int i=0;i<list.size();i++){
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
System.out.println("按编号排序:");
personComparator.orderByColumn(PersonComparator.ID_CARD);//设置为按编号排序
Collections.sort(list,personComparator);
for(int i=0;i<list.size();i++){
Person person = list.get(i);
System.out.println("-----"+person.getId_card()+" "+ person.getName());
}
}
}
程序的运行结果如下:
排序前:
-----马先生 22015
-----王小姐 22020
-----李先生 22018
按姓名排序:
-----李先生 22018
-----马先生 22015
-----王小姐 22020
按编号排序:
-----22015 马先生
-----22018 李先生
-----22020 王小姐
利用这种方式实现对List集合进行客户化排序,排除了每个类只能采用一种排序方式的弊端,可以根据实际需要,将List集合按照不同的方式排序。这里是按姓名的全称升序排列,如果想改为降序排列,只需将例子中的的如下代码:
result = s1.compareTo(s2);
修改改为:
result = s2.compareTo(s2);
编号也是按升序排列的,如果也想改为降序排列,只需将例子中的如下代码:
result = (int)(p1.getId_card()-p2.getId_card());
修改为:
result = (int)(p2.getId_card()-p1.getId_card());
Collections之sort、reverse的更多相关文章
- Python3基础 sort(reverse=True) 将一个列表降序排列
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- Collections在sort()简单分析法源
Collections的sort方法代码: public static <T> void sort(List<T> list, Comparator<? super T& ...
- java中的排序(自定义数据排序)--使用Collections的sort方法
排序:将一组数据按相应的规则 排列 顺序 1.规则: 基本数据类型:日常的大小排序. 引用类型: 内置引用类型(String,Integer..),内部已经指定规则,直接使用即可.---- ...
- python 8:list.sort(reverse=false)、sorted(list, reverse=false)(对列表进行不可恢复排序;对列表进行可恢复排序)
bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles) print(sorted(bicycles)) ...
- Vue 变异方法sort&reverse对评论进行排序
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 对象数组自定义排序--System.Collections.ArrayList.Sort()
使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...
- 数组方法push() pop() shift() unshift() splice() sort() reverse() contact()浅拷贝 slice()原数组拷贝
push() pop() shift() unshift() splice() sort() reverse() 参考资料:https://wangdoc.com/javascript/stdlib/ ...
- Java基础 @org.junit.Test-单元测试方法 + 操纵Collection和Map的工具类 : Collections 的sort/binarySearch/max/min等静态方法
单元测试代码: ( 在IDEA中先输入'@Test '然后根据提示进行自动修订即可!!运行时直接运行即可! 若有多个单元测试块的时候,直接把鼠标放在哪里就自动在哪里运行那个单元块) import ...
- js sort() reverse()
数组中存在的两个方法:sort()和reverse() 直接用sort(),如下: ,,,,,,,,,,,]; console.log(array.sort());ps:[0, 1, 2, 2, 29 ...
随机推荐
- iOS6以后的单个控制器横竖屏显示以及旋转屏控制技巧,附带iOS8以后显示电池状态栏
一.在应用中从竖屏模式强制转换为横屏模式 第一种方法:通过模态弹出视图的方式,使得特定ViewController坚持特定的interfaceOrientation(1)iOS6之后提供了这样一个方法 ...
- c++文件读写相关
在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: ...
- SGU 134.Centroid(图心)
SGU链接: 时间限制:0.25s 空间限制:4M 题意: 给出一个树(节点数<=16000),一个节点的重量定义为从树中去除这个点后,新得到的所有树中节点最多的树的节点数.树的中心定义为所有节 ...
- Queue学习
Queue在Python中可以算作是一种容器,但是他和list,set,dict不一样. 1. Queue不是Python内置类型.它在Queue模块中定义. 2. 它不是iterator容器,他不能 ...
- TortoiseGit(乌龟git)保存用户名密码的方法(转)
转自:http://my.oschina.net/jjyuangu/blog/232798?p=1 windows下比较比较好用的git客户端有2种: 1. msysgit + TortoiseGit ...
- Java学习----你可以知道对象的工作结果(获取方法的返回值)
1.写返回类型 2.return 返回值 3.定义变量接受返回值 public class App2 { public String [] print(String msg, int num) { f ...
- c++ undefined reference to mysqlinit
Solved g++ $(mysql_config --cflags) file.cpp -o filename $(mysql_config --libs)
- 谷歌地图实现车辆轨迹移动播放(google map api)
开发技术:jquery,js baidu map api,json,ajax QQ1310651206 谷歌地图(google map api)实现车辆轨迹移动播放(google map api)
- 初涉JavaScript模式 (1) : 简介
什么是模式? 广义上的模式是指 :在物体或事件上,产生的一种规律变化与自我重复的样式与过程.在模式之中,某些固定的元素不断以可预测的方式周期性重现.最基本而常见的模式,称为密铺,具备重复性以及周期性两 ...
- dedecms flag标签属性
头条[h] flag='h' 推荐[c] flag='c' 幻灯[f] flag='f' 特荐[a] flag='a' 滚动[s] flag='s' 加粗[b] flag='b' 图片[p] flag ...