首页 > 编程语言 >java集合对List进行排序

java集合对List进行排序

时间:2022-11-24 21:26:08浏览次数:58  
标签:sort java Comparator List return 排序 numList

List排序4种写法

  • 方式1:JAVA中我们可以使用java.util.Collections类的sort(List list)方法对list集合中的元素排序。

  • 方式2:JDK8之后特别是lambda表达式的盛行,而且Collections的sort方法其实是调用了List接口自己的sort方法;所以可以使用List接口自己的sort方法排序

  • 方式3:方式2的lambda写法

  • 方式4:Stream流的sort方法写法

集合元素是基本类型包装类型

public static void main(String[] args)  {
        List<Integer> numList=new ArrayList<>();
        numList.add(999);
        numList.add(123);
        numList.add(456);
        numList.add(66);
        numList.add(9);
 
        Collections.sort(numList);  //使用Collections类的方法排序
 
        numList.sort(new Comparator<Integer>() {//使用List接口的方法排序
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });
       
        //lambda表达式实现List接口sort方法排序
        numList.sort((num1,num2)->{return num1.compareTo(num2);});
 
 
        System.out.println(numList);
 
 
    }

对象的集合根据某个属性排序

例如:对User对象集合根据User类的sex属性排序,默认是升序

public static void main(String[] args)  {
        List<User> numList=new ArrayList<>();
        User u=new User();
        u.setSex(12);
        numList.add(u);
 
        User u1=new User();
        u1.setSex(34);
        numList.add(u1);
 
        User u2=new User();
        u2.setSex(6);
        numList.add(u2);
 
        User u3=new User();
        u3.setSex(99);
        numList.add(u3);
 
 
        //Collections类的sort方法对对象集合排序,要传集合和Comparator接口两个参数
        Collections.sort(numList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                Integer sex1= o1.getSex();
                Integer sex2= o2.getSex();
                return  sex1.compareTo(sex2);
            }
        });
        //List接口自身的sort方法对对象集合排序,重写Comparator接口方法即可
        numList.sort(new Comparator<User>() {
            @Override
            public int compare(User u1, User u2) {
                Integer sex1= u1.getSex();
                Integer sex2= u2.getSex();
                return  sex1.compareTo(sex2);
            }
        });
        
        //List接口的sort方法,lambda表达式写法
       numList.sort((u4,u5)->{
            Integer sex1= u4.getSex();
            Integer sex2= u5.getSex();
            return  sex1.compareTo(sex2);
        });
        System.out.println(numList);
 
 
    }

使用Stream流排序

list.stream().sorted(Comparator.comparing(Sortable::getOrder).reversed()).collect(Collectors.toList());

实现:

1.首先你需要list.parallelStream().sorted 进行流处理,使用parallelStream可以充分调度多核CPU。
2.使用Comparator.comparing进行排序,reversed()进行倒序排列,thenComparing进行下一个排序。
3.Comparator.comparing()里面的内容,也是就是Object::getter,例如KeywordCounterDTO::getKeyword
4.最后格式化为需要的格式 List.collect(Collectors.toList()) , Map 是 .collect(Collectors.toMap(KeywordCounterDTO::getKey, KeywordCounterDTO::getValue))

list = list.parallelStream().sorted(
  Comparator.comparing(KeywordCounterDTO::getAllCounter).reversed().thenComparing(KeywordCounterDTO::getKeyword)
).collect(Collectors.toList());

使用 Comparator.reversed 进行排序

返回相反的排序规则

/**
 *  相反的排序规则
 */
Collections.sort(employees, Comparator.comparing(Employee::getName).reversed());

employees.forEach(System.out::println);

使用 Comparator.nullsFirst进行排序

当集合中存在null元素时,可以使用针对null友好的比较器,null元素排在集合的最前面

employees.add(null);  //插入一个null元素
Collections.sort(employees, Comparator.nullsFirst(Comparator.comparing(Employee::getName)));
employees.forEach(System.out::println);


Collections.sort(employees, Comparator.nullsLast(Comparator.comparing(Employee::getName)));
employees.forEach(System.out::println);

使用 Comparator.thenComparing 排序

首先使用 name 排序,紧接着在使用ege 排序

Collections.sort(employees, Comparator.comparing(Employee::getAge).thenComparing(Employee::getName));
employees.forEach(System.out::println);

sort函数详解

升序、降序

sort方法排序默认是升序 ASC

List的Sort函数中的比较函数CompareTo有三种结果 1, -1 ,0分别代表大,小,相等。默认List的排序是升序排序。

举个例子:在比较函数CompareTo()中,如果 x>y return 1;则是按照升序排列。如果x>y return -1;则是按照降序排列。这就是1和-1大小的含义。其实你非要这么写 x<y return 1;则也表示降序排列。不过大家一般习惯x>y return 1;升序,如果想要降序只需return -1;即可。

Tips:系统List默认的排序是升序,如果你想要降序,可以直接在比较函数前面加个负号,把返回结果由1变成-1即可。例如:

List<int> list = new List<int>() { 2, 1, 3, 4 };
list.Sort((x, y) => -x.CompareTo(y));  // CompareTo 默认返回 1 升序
Console.WriteLine(list); //4,3,2,1

非数值类型、string等排序

对于非数值类型、string等或者官方未来实现IComparable接口的类型,可通过实现IComparable接口重写CompareTo方法来排序。

举个例子:自定义一个类,然后继承字: IComparable<>,然后实现接口的方法 int CompareTo(object obj_)就可以了

public class Person : IComparable<Person>
    {
        public int id;
        public string name;
 
        public Person()
        {
            id = 0;
            name = "name";
        }
        public Person(int id_, string name_)
        {
            id = id_;
            name = name_;
        }
 
        public int CompareTo(Person obj_)
        {
            if (this.id > obj_.id)
                return 1;
            else
                return -1;
        }
    }

多权重排序

其实就是对优先级最高的字段进行排序,然后在对次级优先级的字段进行排序就可以了。例如对Persond的对象先进行ID排序,然后再进行Name排序:

public int CompareToIDName(Person x_, Person y_)
        {
            if (x_.id > y_.id)
                return 1;
            else if (x_.id == y_.id)
            {
                return x_.name.CompareTo(y_.name);
            }
            else
                return -1;
        }

匿名函数来实现Comparison

虽然想实现排序上面的接口代码也不多,但有时候只是偶尔排序,并不想修改类,怎么办呢?当然有更简单的方法,委托和lambda表达式:

public void Init()
        {
            m_personList.Add(new Person(10001, "Zhao"));
            m_personList.Add(new Person(10006, "Qian"));
            m_personList.Add(new Person(10006, "Zhao"));
            m_personList.Add(new Person(10004, "Li"));
            m_personList.Add(new Person(10006, "Zhao"));
 
            m_personList.Sort();
 
            m_personList.Sort(delegate (Person x, Person y)
            {
                if (x.id > y.id)
                    return 1;
                else
                    return -1;
            });
 
            m_personList.Sort((x, y) =>
            {
                return x.name.CompareTo(y.name);
            });
 
            m_personList.Sort((x, y) => CompareToIDName(x, y));
        }

原文章地址:

https://blog.csdn.net/qq_42672770/article/details/119840956
https://blog.csdn.net/qq_29569183/article/details/103928183
https://blog.csdn.net/moshowgame/article/details/122052307

标签:sort,java,Comparator,List,return,排序,numList
From: https://www.cnblogs.com/2393920029-qq/p/16923349.html

相关文章

  • Java访问控制符
    Java访问控制符Java访问控制符修饰的对象可以分为两类:class和member(包括method和field)一.修饰classpublic:该类对所有类可见。default(不加修饰符):该类对同一个包下的......
  • Java 应用4核8G性能瓶颈分析步骤
     服务器性能瓶颈表现:CPU使用率达到了百分百什么原因会导致服务器CPU使用率达到百分百1、磁盘IO2、网络IO3、远程接口执行速度以上原因会导致服务响应变慢,为什么慢......
  • Java学习五
    一.小结1.程序模块化和可重用性是软件工程的中心目标之一。java提供了很多有助于完成这一目标的有效结构。方法就是一个这样的结构。2.方法指定方法的修饰符,返回值类型,方......
  • Java 设计模式:工厂模式
    目录工厂模式(FactoryPattern)实现简单工厂模式示例工厂方法模式示例抽象工厂模式示例参考工厂模式(FactoryPattern)所属:创建型模式,适用时机:我们明确地计划不同条件下创建......
  • 2022年度GitHub中文Java项目排行榜Top 10
    1.mall项目地址:https://github.com/macrozheng/mallmall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商......
  • python_list列表
     列表list关键字in和notin用来判断元素是否包含在列表list中,str也能使用list_city01=["北京","北京","杭州"]#判断数据在列表中print("北京"inlist_ci......
  • 排序算法
    零、总览(一)术语说明稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;内排序:所有排序操作都在内存中完成......
  • Java反射机制
    反射特征:动态性编译时候确定不了哪个类的对象比如:后台已经在运行了,但还没有收到前端的请求,这时候,后台收到请求时,使用的是反射机制调用对象反射机制与面向对象的矛盾:不......
  • 洛谷P1090 Java
    [NOIP2004提高组]合并果子/[USACO06NOV]FenceRepairG题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的......
  • Java之微信支付(扫码支付模式二)案例实战-之支付完成后页面跳转方案
    摘要:做过微信扫码支付的同学都知道,微信扫码支付完成后,要跳转到指定的页面就比较麻烦了,这里我提供一种比较可行的方案,也许还有其他更多的方案,但是我这里分享下我们当时是怎么......