Java中集合排序常用的方式

执键写春秋
• 阅读 2171

1. 集合排序概述

1.1 集合排序的主要内容:

  • 集合中的级别数据类型排序

  • 集合中的字符串排序

  • Comparator接口

  • Comparable接口

    1.2 数组排序回顾

    int[] arr={12,25,22,17,89,22};
    Arrays.sort(arr);
    输出:
    12,17,22,22,25,89

    Java的Arrays类中有一个sort()方法,该方法是Arrays类的静态方法,在需要对数组进行排序时,非常的好用。也可以调用sort对数组指定部分进行排序,Arrays.sort(int[] a, int fromIndex, int toIndex)【左闭右开】:

    int[] a = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5};
    Arrays.sort(a, 0, 3);
    for(int i = 0; i < a.length; i ++) {
      System.out.print(a[i] + " ");
    }
    输出:
    7 8 9 2 3 4 1 0 6 5 (只是把 9 8 7排列成了7 8 9)

    1.3 集合如何去排序?

    也是使用sort方法,但不是Array类中的,而是使用Collections类的sort()方法。

  • sort(Listlist)*:根据元素的自然顺序对指定列表按升序进行排序。(数值元素按数值大小进行升序。字符按ASCII码值进行升序。)
    ![K(MC{}KNZU`U$R1UFKT(PGN](https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/ab200e7fd3b7d9fd3cbc13193ee8fd17.png)

  • 注:可以去API文档中去了解一下https://www.matools.com/api/java8*

    2. 对基本数据类型和字符类型进行排序

    2.1 对整型进行排序

    package person.xsc.practice;
    import java.util.*;
    public class IntSort {
    
       public static void main(String[] args) {
           // TODO Auto-generated method stub
            //对存储在List中的整型数据进行排序
           List<Integer> list=new ArrayList<Integer>();
           list.add(5);
           list.add(8);
           list.add(3);
           list.add(1);
           list.add(12);
           System.out.println("排序前:");
           for(int n:list){
               System.out.print(n+" ");
           }
           System.out.println();
           //对List中的数据进行排序
           Collections.sort(list);
           System.out.println("排序后:");
           for(int n:list){
               System.out.print(n+" ");
           }
       }
    }
    输出:
    排序前:
    5 8 3 1 12 
    排序后:
    1 3 5 8 12 

    2.2 对字符串进行排序

    package person.xsc.practice;
    import java.util.*;
    public class StringSort {
       public static void main(String[] args) {
           // TODO Auto-generated method stub
           //对存放在List中的字符串进行排序
           List<String> list=new ArrayList<String>();
           list.add("orange");
           list.add("blue");
           list.add("yellow");
           list.add("gray");
           System.out.println("排序前:");
           for(String s:list){
               System.out.print(s+" ");
           }
           System.out.println();
           Collections.sort(list);
           System.out.println("排序后:");
           for(String s:list){
               System.out.print(s+" ");
           }
       }
    }
    输出:
    排序前:
    orange blue yellow gray 
    排序后:
    blue gray orange yellow 

    3. Comparator接口

    3.1 Comparator接口简单介绍

  • 强行对某个对象进行整体排序的比较函数

  • 可以将Comparator 传递给sort方法(如在集合中排序Collections.sort 或在数组中Arrays.sort)

  • int compare(T o1,T o2)比较用来排序的两个参数。如果o1<o2,返回负整数;如果o1==o2,返回0;如果o1>02,返回正整数

  • boolean equals(Object obj)指示某个其他对象是否“等于”此Comparator

  • 此方法可以被Object类中的equals方法覆盖,不必重写

    3.2 案例-对学生按姓名升序排序

    package person.xsc.practice;
    public class Student {
      //成员变量
      private int id;
      private int age;
      private String name;
      //构造方法
      public Student(){}
      public Student(String name,int id,int age){
          this.id=id;
          this.age=age;
          this.name=name;
      }
      //getter和setter方法
      public int getId(){
          return id;
      }
      public void setId(int id){
          this.id=id;
      }
      public int getAge(){
          return age;
      }
      public void setAge(int age){
          this.age=age;
      }
      public String getName(){
          return name;
      }
      public void setName(String name){
          this.name=name;
      }
      //toString()方法
      public String toString(){
          return "【学号:" + this.getId() + ",年龄:" + this.getAge() + ",姓名:" + this.getName() + "】";
      }
    }
    package person.xsc.practice;
    import java.util.Comparator;
    public class NameComparator implements Comparator<Student> {
      @Override
      public int compare(Student o1, Student o2) {
          // TODO Auto-generated method stub
          return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
      }
    

}

package person.xsc.practice; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; public class StudentTest{ public static void main(String[] args){ //定义Student类的对象 Student s1=new Student("peter",40,20); Student s2=new Student("angel",28,5); Student s3=new Student("tom",35,18); Student s4=new Student("Aom",35,18); Student s5=new Student("Zom",35,18); //将对象添加到List中 List arrayList=new ArrayList(); arrayList.add(s1); arrayList.add(s2); arrayList.add(s3); arrayList.add(s4); arrayList.add(s5); //输出排序前的数据 System.out.println("按名字排序前:"); for(Student student:arrayList){ System.out.println(student); } //排序 Collections.sort(arrayList,new NameComparator());

    //第一种方式输出排序后的数据1
    System.out.println("按名字排序后:");
    for(Student student:arrayList){
        System.out.println(student);
    }
       //第二种方式输出排序后的数据
    System.out.println("按名字排序后:");
    Iterator<Student> it = arrayList.iterator();
    while(it.hasNext()){
        System.out.println(it.next() + " ");
    }
}

}

按名字排序前: 【学号:40,年龄:20,姓名:peter】 【学号:28,年龄:5,姓名:angel】 【学号:35,年龄:18,姓名:tom】 【学号:35,年龄:18,姓名:Aom】 【学号:35,年龄:18,姓名:Zom】 按名字排序后: 【学号:35,年龄:18,姓名:Aom】 【学号:35,年龄:18,姓名:Zom】 【学号:28,年龄:5,姓名:angel】 【学号:40,年龄:20,姓名:peter】 【学号:35,年龄:18,姓名:tom】 按名字排序后: 【学号:35,年龄:18,姓名:Aom】 【学号:35,年龄:18,姓名:Zom】 【学号:28,年龄:5,姓名:angel】 【学号:40,年龄:20,姓名:peter】 【学号:35,年龄:18,姓名:tom】

## 3.3 案例-对学生按年龄升序排序
将compare方法中返回改为return o1.getAge()-o2.getAge();
# 4. Comparable接口
## 4.1 Comparable接口简单介绍
- 此接口强行对实现它的每个类的对象进行整体排序,这种排序别称为类的自然排序,类的compareTo方法被称为它的自然比较方法。
- int compareTo(T o)方法
该对象(实现接口的类的对象)小于、等于或大于指定对象,则分别返回负整数、零或正整数。
## 4.2 对商品价格进行降序排序

package person.xsc.practice; public class Goods implements Comparable{ private String id; private String name; private double price; public Goods() {

}
public Goods(String id,String name,double price) {
    this.id=id;
    this.name=name;
    this.price=price;
}
public String getId() {
    return id;
}
public void setId(String id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public double getPrice() {
    return price;
}
public void setPrice(double price) {
    this.price = price;
}
@Override
public String toString() {
    return "Goods [id=" + id + ", name=" + name + ", price=" + price + "]";
}

@Override
public int compareTo(Goods o) {
    // TODO Auto-generated method stub
    return new Double(o.getPrice()-this.getPrice()).intValue();
}

}

package person.xsc.practice; import java.util.*; public class GoodsTets2 { public static void main(String[] args) { // TODO Auto-generated method stub Goods g1=new Goods("s00001","手机",2000); Goods g2=new Goods("s00002","冰箱",5000); Goods g3=new Goods("s00003","电视机",3000); List goodsList=new ArrayList(); goodsList.add(g1); goodsList.add(g2); goodsList.add(g3); //排序前 System.out.println("排序前:"); for(Goods goods:goodsList){ System.out.println(goods); } Collections.sort(goodsList); System.out.println("排序后:"); for(Goods goods:goodsList){ System.out.println(goods); } }

}

排序前: Goods [id=s00001, name=手机, price=2000.0] Goods [id=s00002, name=冰箱, price=5000.0] Goods [id=s00003, name=电视机, price=3000.0] 排序后: Goods [id=s00002, name=冰箱, price=5000.0] Goods [id=s00003, name=电视机, price=3000.0] Goods [id=s00001, name=手机, price=2000.0]

# 5. Comparator接口与Comparable接口区别 
- 都是java的一个接口, 并且是用来对自定义的类进行大小比较
- Comparator属于java.util包,Compatable属于java.lang包
- Comparator,要比较的类需要在外部实现改接口,Comparable,在要比较的类里实现该接口
- Comparator调用sort方法时,要指定Compatator的实现类(sort.(集合名 ,new 实现类()),Comparable调用sort()方法时,只需指定集合名即可 sort.(集合名)
- 由于Comparator的特性,所以Comparator可以实现多种比较方式(创建多个实现类即可),而Comparable只能实现一种比较方式(因为要在被比较的类中实现)。   
# 6. 案例实现
商场正在搞活动,活动规则如下:一楼到十楼的每层电梯门口都放有一束花,花束大小不一,参与者乘坐电梯从一楼到十楼,每层楼电梯门都会打开一次,手里只能拿一束花,小慕特别想要那束最大的花,如何拿到最大的那束花呢? 

package person.xsc.practice;

public class Flower implements Comparable{ private String name; private double size; private int floor; public Flower() {} public Flower(String name, double size,int floor) { this.name = name; this.size = size; this.floor=floor; }

public int getFloor() {
    return floor;
}
public void setFloor(int floor) {
    this.floor = floor;
}
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public double getSize() {
    return size;
}

public void setSize(double size) {
    this.size = size;
}

@Override
public String toString() {
    return "Flower [name=" + name + ", size=" + size + ", floor=" + floor + "]";
}

@Override
public int compareTo(Flower o) {
    // TODO Auto-generated method stub
    return  new Double(o.getSize()-this.getSize()).intValue();
}

}

package person.xsc.practice; import java.util.*; public class FlowerTest {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<Flower> list = new ArrayList<>();
    list.add(new Flower("菊    花",30.6,1));
    list.add(new Flower("太阳花",13.5,2));
    list.add(new Flower("满天星",16.5,3));
    list.add(new Flower("玫瑰花",13.5,4));
    list.add(new Flower("玫瑰花",19.5,5));
    list.add(new Flower("紫罗兰",16.5,6));
    list.add(new Flower("曼陀罗",17.3,7));
    list.add(new Flower("康乃馨",14.2,8));
    list.add(new Flower("玫瑰花",35.5,9));
    list.add(new Flower("玫瑰花",50.5,10));
    Collections.sort(list);
    System.out.println("最大的花是第"+list.get(0).getFloor()+"层的"+list.get(0).getName()+",大小是"+list.get(0).getSize());
}

} 输出:最大的花是第10层的玫瑰花,大小是50.5

# 6. 关于集合排序的面试问题
- **Comparable和Comparator接口是干什么的?列出它们的区别。**

Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。
Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。
- **List集合中根据对象的某一属性排序【手写代码】**
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
java 数据结构(十二):Collections工具类的使用
Collections工具类1.作用:操作Collection和Map的工具类2.常用方法:reverse(List):反转List中元素的顺序shuffle(List):对List集合元素进行随机排序sort(List):根据元素的自然顺序对指定List集合元素升序排序sort(List,Comparator)
Wesley13 Wesley13
2年前
java反射练习 对集合中元素 按照方法进行排序
/\\\对集合中元素按照指定方法进行排序\\@paramlist需要排序的集合\@paramproperty时间对象在集合对象中属性名称\@parammethod排序字段get方法\@paramreverse是否倒序\/publicstatic<Tvoidsor
Wesley13 Wesley13
2年前
java.lang.Comparable
Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的_自然排序_,类的compareTo方法被称为它的_自然比较方法_。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
Wesley13 Wesley13
2年前
Java比较器
前言本篇文章主要介绍的是Java比较器的实现与测试。1.java.lang.Comparable排序接口定义:Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays
Stella981 Stella981
2年前
List自定义对象的排序,根据对象的某一列进行排序
  在工作中,经常需要对List对象集合进行排序操作,下面总结下搞个通用排序对象,原理是使用JAVA的    Comparator  接口实现排序  不多说直接上“干货”1、存在实体类:1@Data2@AllArgsConstructor3@NoArgsConstructo
Stella981 Stella981
2年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Wesley13 Wesley13
2年前
Jdk 6 学习记录
java.util.Arrays 类// 自然排序Arrays.sort(Object obj);// 自然排序,在指定范围内Arrays.sort(Object obj,int fromIndex,int toIndex);// 在数组中找指定Key,返回索引(
Stella981 Stella981
2年前
Comparator和Comparable
12\.比较器java.util接口Comparator集合具有比较特性。强行对某个对象collection进行整体排序的比较函数。可以将Comparator传递给sort方法(如Collections.sort或Arrays.sort)