List集合排序
List对象集合按照对象的某个属性排序
public static void sort(List list) :将集合中元素按照默认规则排序。
sort方法:
-
public static void sort(List list,Comparator<? super T> ) :将集合中元素按照指定规则排
序。
- public static void sort(List list,Comparator<? super T> ) :将集合中元素按照指定规则排
序。
int compare(T o1, T o2);
目的就是为了比较o1和o2的大小
原始的排序:o1 , o2
返回值int:只关心正负或者0
如果返回值为负数:o1 < o2 ==> o1 o2
如果返回值为正数:o1 > o2 ==> o2 o1
如果返回值为0:o1 == o2 ==> o1 o2
public class Demo01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("abc12");
list.add("AA");
list.add("1ab123123");
list.add("abdsdfsd");
list.add("Abcsdfsfsdfsdsdg");
list.add("2bcsd");
Collections.sort(list);
System.out.println("list = " + list);
//按照字符串的长度升序排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
});
System.out.println("list = " + list);
}
}
区别:
Comparable:是让一个类具备比较排序的功能
Comparator:自己定义的一个比较器
注意:如果比较的属性类型是浮点型
public int compareTo(T o); //抽象方法
//子类实现后,需要进行重写
返回值int,只关心正负或者0,不需要关系具体值
原始排序:this【我】 o【他】
如果要升序排序:我减他
如果要降序排序:他-我
如果比较的属性类型是浮点型:
this.score = 99.9 o.score = 99.5
if(this.score>o.score){
return 1;
}else if(this.score<0.score){
return -1;
}else{
return 0;
}
按照对象单属性升序,降序排序
/**
* 对象单属性升序,降序排序
*/
private void entitySort1(){
//Student 的 list 集合
List<Student> students = new ArrayList<>();
students.add(new Student("张三",90,180,"电气学院","北京"));
students.add(new Student("李四",80,165,"计算机学院","上海"));
students.add(new Student("王五",91,170,"财经学院","上海"));
students.add(new Student("赵明",80,182,"计算机学院","北京"));
students.add(new Student("钱海",75,181,"计算机学院","广州"));
students.add(new Student("孙理",82,172,"财经学院","上海"));
students.add(new Student("周伟",90,168,"电气学院","广州"));
students.add(new Student("郑亮",80,178,"财经学院","广州"));
System.out.println("原始数据:");
students.forEach(s ->{
System.out.println(s.getName()+" "+ s.getScore()+" "+s.getHeight()+" "+ s.getCollege()+""+s.getAddress());});
System.out.println("按照分数升序排序:");
students.sort(comparing(Student::getScore));
students.forEach(s ->{
System.out.println(s.getName()+" "+ s.getScore()+" "+s.getHeight()+" "+ s.getCollege()+""+s.getAddress());});
System.out.println("按照分数降序排序:");
students.sort(comparing(Student::getScore).reversed());
students.forEach(s ->{
System.out.println(s.getName()+" "+ s.getScore()+" "+s.getHeight()+" "+s.getCollege()+""+s.getAddress());});
}
Map排序
-
Hashmap排序则按照map中的value进行排序 先将map的转换为list,在将list进行排序 //对map进行排序 List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(dataTotalSummap.entrySet()); Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() { //降序排序 public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return -(o1.getValue().compareTo(o2.getValue()));//升序排序则去除富豪 } });
按照对象自定义单属性的顺序排序
/**
* 对象自定义单属性的顺序排序
*/
private void entitySort3(){
//Student 的 list 集合
List<Student> students = new ArrayList<>();
students.add(new Student("张三",90,180,"电气学院","北京"));
students.add(new Student("李四",80,165,"计算机学院","上海"));
students.add(new Student("王五",91,170,"财经学院","上海"));
students.add(new Student("赵明",80,182,"计算机学院","北京"));
students.add(new Student("钱海",75,181,"计算机学院","广州"));
students.add(new Student("孙理",82,172,"财经学院","上海"));
students.add(new Student("周伟",90,168,"电气学院","广州"));
students.add(new Student("郑亮",80,178,"财经学院","广州"));
System.out.println("原始数据:");
students.forEach(s ->{
System.out.println(s.getName()+" "+ s.getScore()+" "+s.getHeight()+" "+s.getCollege()+""+s.getAddress());});
System.out.println("自定义按照地区(北京,上海,广州)排序:");
List<String> addressOrder = Arrays.asList("北京","上海","广州");
Collections.sort(students, new Comparator<Student>()
{
public int compare(Student student1, Student student2)
{
int io1 = addressOrder.indexOf(student1.getAddress());
int io2 = addressOrder.indexOf(student2.getAddress());
return io1 - io2;
}
});
students.forEach( s ->{
System.out.println(s.getName()+" "+ s.getScore()+" "+s.getHeight()+" "+s.getCollege()+""+s.getAddress());});
按照对象自定义多属性的顺序排序
**
* 对象自定义多属性的顺序排序
*/
private void entitySort4(){
//Student 的 list 集合
List<Student> students = new ArrayList<>();
students.add(new Student("张三",90,180,"电气学院","北京"));
students.add(new Student("李四",80,165,"计算机学院","上海"));
students.add(new Student("王五",91,170,"财经学院","上海"));
students.add(new Student("赵明",80,182,"计算机学院","北京"));
students.add(new Student("钱海",75,181,"计算机学院","广州"));
students.add(new Student("孙理",82,172,"财经学院","上海"));
students.add(new Student("周伟",90,168,"电气学院","广州"));
students.add(new Student("郑亮",80,178,"财经学院","广州"));
System.out.println("原始数据:");
students.forEach(s ->{
System.out.println(s.getName()+" "+ s.getScore()+" "+s.getHeight()+" "+s.getCollege()+""+s.getAddress());});
System.out.println("先按照学院(电气学院,计算机学院,财经学院)排序, 当学院相同时,按照地区(北京,上海,广州)排序");
List<String> collegeOrder = Arrays.asList("电气学院","计算机学院","财经学院");
List<String> addressOrder = Arrays.asList("北京","上海","广州");
Collections.sort(students, new Comparator<Student>()
{
public int compare(Student student1, Student student2)
{
if(student1.getCollege().equals(student2.getCollege())){
int io1 = addressOrder.indexOf(student1.getAddress());
int io2 = addressOrder.indexOf(student2.getAddress());
return io1 - io2;
}else{
int io1 = collegeOrder.indexOf(student1.getCollege());
int io2 = collegeOrder.indexOf(student2.getCollege());
return io1 - io2;
}
}
});
students.forEach( s ->{
System.out.println(s.getName()+" "+ s.getScore()+" "+s.getHeight()+" "+s.getCollege()+""+s.getAddress());});
}
}
TreeMap
TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。
Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)
方法即可实现排序,该方法主要是根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数。如下:
public class TreeMapTest {
public static void main(String[] args) {
Map<String, Object> map = new TreeMap<String, Object>(
new Comparator<String>() {
@Override
public int compare(String obj1, String obj2) {
// 降序排序
return obj2.compareTo(obj1);
}
});
map.put("2019-03", "ccccc");
目录
map.put("2018-12", "aaaaa");
map.put("2019-01", "bbbbb");
map.put("2019-02", "ddddd");
Set<String> keySet = map.keySet();
Iterator<String> iter = keySet.iterator();
while (iter.hasNext()) {
String key = iter.next();
System.out.println(key + ":" + map.get(key));
}
}
}
运行结果如下:
2019-03:ccccc
2019-02:ddddd
2019-01:bbbbb
2018-12:aaaaa