Java 中 List 元素排序

转载请注明来源: http://blog.csdn.net/kjunchen/article/details/51559020

Java 中 List 元素排序

对 List 中的元素进行排序可以使用 java.util.Collections 类中的sort()方法。既可以给方法传递一个 List 对象,也可以传递一个 List 和一个 Comparator 。如果列表中的元素全都是相同类型的类,并且这个类实现了 Comparable 接口,可以简单的调用 Collections.sort() 。如果这个类没有实现 Comparator ,你也可以传递一个 Comparator 到方法 sort() 中,进行排序。如果你不想使用缺省的分类顺序进行排序,你同样可以传递一个 Comparator 到方法 sort() 中来进行排序。

方式一: List 中对象实现 Comparable 接口

1、 创建对象并实现 Comparable 接口

public class Cat implements Comparable<Cat> {
    private String name;
    private Integer order;

    public Cat(String name, Integer order) {
        super();
        this.name = name;
        this.order = order;
    }

    public String getName() {
        return name;
    }

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

    public Integer getOrder() {
        return order;
    }

    public void setOrder(Integer order) {
        this.order = order;
    }

    @Override
    public int compareTo(Cat o) {
        return this.getOrder().compareTo(o.getOrder());
    }

    @Override
    public String toString() {
        return "Cat [name=" + name + ", order=" + order + "]";
    }
}

2、 调用 Collections.sort(List) 方法进行排序

public static void main(String[] args) {
    List<Cat> catList = new ArrayList<>();
    Cat cat1 = new Cat("name1", 1);
    Cat cat2 = new Cat("name2", 2);
    Cat cat3 = new Cat("name3", 3);
    catList.add(cat3);
    catList.add(cat1);
    catList.add(cat2);
    System.out.println("未排序: " + catList.toString());
    //调用 Collections.sort() 方法进行排序
    Collections.sort(catList);
    System.out.println("排序后: " + catList.toString());
}

执行结果为:

未排序: [Cat [name=name3, order=3], Cat [name=name1, order=1], Cat [name=name2, order=2]]
排序后: [Cat [name=name1, order=1], Cat [name=name2, order=2], Cat [name=name3, order=3]]

方式二: 重载 Collections.sort() 方法

1、 创建对象

public class Dog {
    private String name;
    private Integer order;

    public Dog(String name, Integer order) {
        super();
        this.name = name;
        this.order = order;
    }

    public String getName() {
        return name;
    }

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

    public Integer getOrder() {
        return order;
    }

    public void setOrder(Integer order) {
        this.order = order;
    }

    @Override
    public String toString() {
        return "Dog [name=" + name + ", order=" + order + "]";
    }

}

2、 调用 Collections.sort(List, Comparator) 方法进行排序

public static void main(String[] args) {
        List<Dog> dogList = new ArrayList<>();
        Dog dog1 = new Dog("name1", 1);
        Dog dog2 = new Dog("name2", 2);
        Dog dog3 = new Dog("name3", 3);
        dogList.add(dog3);
        dogList.add(dog1);
        dogList.add(dog2);
        System.out.println("未排序: " + dogList.toString());
        //调用 Collections.sort() 方法进行排序,传入List 和 Comparator
        Collections.sort(dogList, new Comparator<Dog>() {
            @Override
            public int compare(Dog o1, Dog o2) {
                return o1.getOrder().compareTo(o2.getOrder());
            }
        });
        System.out.println("排序后: " + dogList.toString());
    }

执行结果为:

未排序: [Dog [name=name3, order=3], Dog [name=name1, order=1], Dog [name=name2, order=2]]
排序后: [Dog [name=name1, order=1], Dog [name=name2, order=2], Dog [name=name3, order=3]]

欢迎加QQ群交流: 365532949
Homepage: http://junkchen.com

### Java 中对 `List` 集合元素进行排序Java 中,可以通过多种方式来对 `List` 类型的集合进行排序。对于实现了 `Comparable` 接口的对象列表可以直接调用 `Collections.sort()` 方法完成默认升序排列;如果希望自定义排序逻辑,则需提供相应的 `Comparator` 实现。 #### 使用流操作符 `.stream()` 通过引入 Stream API 可以更加简洁地处理复杂排序需求: ```java // 假设有如下 User 对象组成的 List 列表 List<User> users = Arrays.asList( new User("Alice", 30), new User("Bob", 24), new User("Charlie", 35) ); // 按年龄降序再按分数升序排序 List<User> sortedUsers = users.stream() .sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getScore)) .collect(Collectors.toList()); ``` 此段代码展示了如何利用 Lambda 表达式以及方法引用创建复合条件下的比较器,并最终收集到新的有序列表中[^2]。 #### 处理含有 null 的情况 当待排序的数据集中可能包含 `null` 值时,为了防止运行期异常的发生,应该采用能够妥善处理这种情况的方式来进行排序: ```java import java.util.*; public class Main { public static void main(String[] args) throws Exception { ArrayList<String> names = new ArrayList<>(Arrays.asList("John", "Jane", null, "Jim")); // 将 null 放置在最前面 Collections.sort(names, Comparator.nullsFirst(Comparator.naturalOrder())); System.out.println("Null first: " + names); // 或者将 null 放置于最后面 Collections.sort(names, Comparator.nullsLast(Comparator.naturalOrder())); System.out.println("Null last: " + names); } } ``` 这段程序说明了两种不同的策略用于控制 `null` 在排序后的相对位置[^4]。 #### 自定义多级排序规则 除了简单的属性对比外,在某些场景下还需要考虑更复杂的排序顺序组合。此时可以借助于第三方库 Apache Commons Lang 提供的帮助类 `BeanComparator` 和 `ComparatorChain` 来构建灵活的多重排序方案: ```java import org.apache.commons.beanutils.BeanComparator; import org.apache.commons.collections.ComparatorUtils; ... students.sort((o1, o2) -> { ComparatorChain<Object> chain = new ComparatorChain<>(); // 添加多个级别的比较项 chain.addComparator(new BeanComparator<>("grade")); chain.addComparator(ComparatorUtils.REVERSE_COMPARATOR.compose(new BeanComparator<>("birthday"))); chain.addComparator(new BeanComparator<>("height")); return (Integer)chain.compare(o1, o2); }); ``` 上述例子中不仅体现了基于不同字段依次判断大小的能力,还加入了反向排序的支持[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值