集合涉及到的排序方式

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排序 

  1. 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");

目录

List集合排序

sort方法:

按照对象单属性升序,降序排序

Map排序 

按照对象自定义单属性的顺序排序

按照对象自定义多属性的顺序排序 

TreeMap


        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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值