在对于 Java 中进行集合 排序时,一般用到 Collections 工具类,它提供了很多方便我们操作集合的方法,其中就包括了集合的排序方法:

Java集合反排序 java 集合 排序_System

 

 

 一、基本类型的比较:

  此处示例 字符串集合 和 整数集合 排序:

@Test
public void testjichuSort() {
    List<String> strList = new ArrayList<>();
    strList.add("15");
    strList.add("12");
    strList.add("18");
    // 字符串排序
    Collections.sort(strList);
    /*strList.sort(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o2.compareTo(o1);
        }
    });*/
    System.out.println("*******字符串排序********");
    for (String s : strList) {
        System.out.println(s);
    }
    List<Integer> intList = new ArrayList<>();
    intList.add(15);
    intList.add(12);
    intList.add(18);
    intList.add(8);
    Collections.sort(intList);
    System.out.println("*************整数类型排序***********");
    for (Integer integer : intList) {
        System.out.println(integer);
    }
}

  结果为:

Java集合反排序 java 集合 排序_List_02

 为什么基础类型的集合,可以直接调用 sort 排序,而不需要重新 实现 Comparable 接口类?

  由Collections.sort() 方法源代码可知:

Java集合反排序 java 集合 排序_ide_03

   调用该 sort() 方法的前提条件时,该集合 list 的类型 T 必须实现  Comparable 才行;

  但是 基础类型 都默认继承了  Comparable 类,所以可以直接使用 sort 方法:

Java集合反排序 java 集合 排序_System_04

Java集合反排序 java 集合 排序_ide_05

 二、对于集合中的对象的比较 (根据对象的某些属性来排序):

  由于不是基础类型,从 Collections.sort() 的方法源码可知,需要重写一个 实现 comparator 接口的类,类中实现定义排序的方法才行:

Java集合反排序 java 集合 排序_List_06

   对象类定义:SortObject.java:

package com.example.test;

public class SortObject {

    private String name;

    private Integer number;

    public SortObject() {
    }

    public SortObject(String name, Integer number) {
        this.name = name;
        this.number = number;
    }

    public String getName() {
        return name;
    }

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

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }

    @Override
    public String toString() {
        return "SortObject{" +
                "name='" + name + '\'' +
                ", number=" + number +
                '}';
    }
}

  比较方法,及其实现 Comparator 接口的 实现类:

@Test
    public void testObjectSort() {
        List<SortObject> objectList = new ArrayList<>();
        objectList.add(new SortObject("D1", 1));
        objectList.add(new SortObject("C1", 2));
        objectList.add(new SortObject("B1", 3));
        objectList.add(new SortObject("A1", 4));
        // 此处 实例化一个 自定义并实现 Comparator 接口的 实例类
        Collections.sort(objectList, new comparatorObject());
        for (SortObject sortObject : objectList) {
            System.out.println(sortObject.toString());
        }
    }

    // 实现 Comparator 接口,并实现该接口的 compare 方法的类
    class comparatorObject implements Comparator<SortObject> {
        @Override
        public int compare(SortObject o1, SortObject o2) {
            return o1.getName().compareTo(o2.getName());
        }
    }

  运行结果为:

Java集合反排序 java 集合 排序_ide_07

三、采用匿名内部类的方式(常用):(不分基础类还是对象类)

  使用范围:

  • 对于基础类来说,想自定义排序方式;
  • 对于对象类来说,不用每次比较都要手动创建一个实体类来重写比较方法;

  在 二 代码的基础上:

@Test
    public void testSortByCustom() {
        List<SortObject> objectList = new ArrayList<>();
        objectList.add(new SortObject("D1", 1));
        objectList.add(new SortObject("C1", 2));
        objectList.add(new SortObject("B1", 3));
        objectList.add(new SortObject("A1", 4));
        // 采用 匿名内部类的 方式,自定义排序
        Collections.sort(objectList, new Comparator<SortObject>() {
            @Override
            public int compare(SortObject o1, SortObject o2) {
                // 正序
//                return o1.getName().compareTo(o2.getName());
                // 倒序
                return o2.getName().compareTo(o1.getName());
            }
        });
        for (SortObject sortObject : objectList) {
            System.out.println(sortObject.toString());
        }
    }

  结果为:

Java集合反排序 java 集合 排序_ide_08

 

 

 

  总结:

  • 在 字符串 集合的排序中,一般默认的排序都是按照每个 字符串的长度来一一比较,如果字符串长度不一致的话,会导致意外的排序结果;为了避免这种情况,一般采用自定义的排序,重写排序的判断逻辑;
  • 基础类排序,可以直接使用 sort() ;
  • 对象类排序,建议使用匿名内部类的方式自定义排序方式