List集合中对数据实现多重规则进行排序的案例

List集合进行排序时,很多人会考虑冒泡、快速等排序算法,但是对于多重排序规则的话,算法就不太适用了。其实java.util.Collections已经提供了sort的排序方法,并且能自己实现其排序规则。

现在有个场景:我需要对一批优惠券进行排序,优惠券有三个属性:是否可用、券类型、面额。我需要将可用的、券类型最大的、面额最大的券排到最前面。

即优先按是否可用排序,其次是券类型,再者就是面额。

话不多说,看代码吧:

package com.test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
 * List多重规则排序测试类
 */
public class TestCompartor {
  public static void main(String[] args) {
    ArrayList<Coupon> persons = new ArrayList<Coupon>();
    persons.add(new Coupon(13,0,new BigDecimal(40)));
    persons.add(new Coupon(13,0,new BigDecimal(50)));
    persons.add(new Coupon(13,0,new BigDecimal(45)));
    persons.add(new Coupon(1,0,new BigDecimal(20)));
    persons.add(new Coupon(13,1,new BigDecimal(30)));
    persons.add(new Coupon(1,0,new BigDecimal(25)));
    persons.add(new Coupon(11,0,new BigDecimal(50)));
    persons.add(new Coupon(11,1,new BigDecimal(40)));
    System.out.println("排序之前:");
    for (int i = 0; i <persons.size(); i++) {
      System.out.println(persons.get(i));
    }
    System.out.println();
    Collections.sort(persons, new Comparator<Coupon>() {
      //按可用升序,券类型降序,面额降序
      public int compare(Coupon o1, Coupon o2) {
        if (o1.valueAble.compareTo(o2.valueAble)==0){
         if(o2.themeType.compareTo(o1.themeType)==0){
         return o2.amount.compareTo(o1.amount)>0?1:-1;
         }else{
         return o2.themeType - o1.themeType;
         }
        }else{
          return o1.valueAble-o2.valueAble ;
        }
      }
    });
    System.out.println("排序后结果:");
    for (int i = 0; i <persons.size(); i++) {
      System.out.println(persons.get(i));
    }
  }
  static class Coupon{
    public Integer themeType; //优惠券类型
    public Integer valueAble; //可用 ,0 可用,1不可用
    public BigDecimal amount; //面额
    @Override
    public String toString() {
      return "Person{" +
          "themeType=" + themeType +
          ", valueAble=" + valueAble +
          ", amount=" + amount +
          '}';
    }
 public Coupon(Integer themeType, Integer valueAble, BigDecimal amount) {
  super();
  this.themeType = themeType;
  this.valueAble = valueAble;
  this.amount = amount;
 }
  }
}

至于封装工具类我就懒得弄了,有需要的自己封装吧。

这里如果用了Integer等封装类型,最好自己也做下非空处理。

排序之前:

Person{themeType=13, valueAble=0, amount=40} Person{themeType=13, valueAble=0, amount=50} Person{themeType=13, valueAble=0, amount=45} Person{themeType=1, valueAble=0, amount=20} Person{themeType=13, valueAble=1, amount=30} Person{themeType=1, valueAble=0, amount=25} Person{themeType=11, valueAble=0, amount=50} Person{themeType=11, valueAble=1, amount=40}

排序后结果:

Person{themeType=13, valueAble=0, amount=50} Person{themeType=13, valueAble=0, amount=45} Person{themeType=13, valueAble=0, amount=40} Person{themeType=11, valueAble=0, amount=50} Person{themeType=1, valueAble=0, amount=25} Person{themeType=1, valueAble=0, amount=20} Person{themeType=13, valueAble=1, amount=30} Person{themeType=11, valueAble=1, amount=40}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Java中对list元素进行排序的方法详解

    在Java Collection Framework中定义的List实现有Vector,ArrayList和LinkedList.这些集合提供了对对象组的索引访问.他们提供了元素的添加与删除支持.然而,它们并没有内置的元素排序支持. 你能够使用java.util.Collections类中的sort()方法对List元素进行排序.你既可以给方法传递一个List对象,也可以传递一个List和一个Comparator.如果列表中的元素全都是相同类型的类,并且这个类实现了Comparable接口,你可

  • Java针对ArrayList自定义排序的2种实现方法

    本文实例讲述了Java针对ArrayList自定义排序的2种实现方法.分享给大家供大家参考,具体如下: Java中实现对list的自定义排序主要通过两种方式 1)让需要进行排序的对象的类实现Comparable接口,重写compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用Collections.sort()来排序对象数组 public class Student implements Comparable{ private int id; private int age; p

  • 用Java集合中的Collections.sort方法如何对list排序(两种方法)

    第一种是list中的对象实现Comparable接口,如下: /** * 根据order对User排序 */ public class User implements Comparable <user> { private String name; private Integer order; public String getName() { return name; } public void setName(String name) { this.name = name; } publi

  • Java对List进行排序的两种实现方法

    前言 Java.util包中的List接口继承了Collection接口,用来存放对象集合,所以对这些对象进行排序的时候,要么让对象类自己实现同类对象的比较,要么借助比较器进行比较排序. 学生实体类,包含姓名和年龄属性,比较时先按姓名升序排序,如果姓名相同则按年龄升序排序. 第一种:实体类自己实现比较 (实现comparable接口:public interface Comparable<T> ,里面就一个方法声明:public int compareTo(T o); ) 示例代码: publ

  • Java Collections.sort()实现List排序的默认方法和自定义方法

    1.java提供的默认list排序方法 主要代码: List<String> list = new ArrayList();list.add("刘媛媛"); list.add("王硕"); list.add("李明"); list.add("刘迪"); list.add("刘布"); //升序 Collections.sort(list,Collator.getInstance(java.uti

  • Java中对list map根据map某个key值进行排序的方法

    实例如下所示: package test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; public class java_ListMapSort { public static void main(String[] args)

  • Java实现对两个List快速去重并排序操作示例

    本文实例讲述了Java实现对两个List快速去重并排序操作.分享给大家供大家参考,具体如下: 1:去重并排序 package twolist; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.uti

  • java ArrayList集合中的某个对象属性进行排序的实现代码

    开发中有时候需要自己封装分页排序时,List如何对某一属性排序呢,分享一个小实例,大家共勉,希望能对大家有用,请多多指教. 1.Student的Bean如下: public class Student { private int age; private String name; private String weight; public String getWeight() { return weight; } public void setWeight(String weight) { th

  • java中List对象列表实现去重或取出及排序的方法

    前言 因为在面试的时候碰到几次list的去重和排序,觉着有必要给大家总结一下具体的方法,分享出来供大家学习参考,话不多说了,来一起看看下面介绍的一种做法: 一.list去重 1.1 实体类Student List<Student>容量10k以上,要求去重复.这里Student的重复标准是属性相同,因此需要重写equals和hashcode方法,不知道有几个可以手写出来. student的equals方法: public void equals(Object o){ if(this == o)

  • java 中List按照date排序的实现

    java 中List按照date排序的实现 今天开发需要对一个list进行排序,要求对里面的date类型的属性进行排序,不多说,直接上代码. Leavecalendar这个bean类里面有属性date: private Date Date; //有get/set方法: public Date getDate() { return Date; } public void setDate(Date lcDate) { this.Date = lcDate; } 排序我们要用到java里面的Colle

随机推荐