迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

如何在 Java 中以自然顺序和自定义顺序对 ArrayList 进行排序

作者:迹忆客 最近更新:2023/01/30 浏览次数:

在 Java 中对 ArrayList 进行排序是 Java 开发人员的一项常见任务,在我上一篇文章 Java 中 ArrayList 的 10 个示例中讨论时以及在讨论 Java 中的 comparator 和 comparable 时,我们已经触及了它。 为了对 ArrayList 进行排序,我们需要使用 Collections 实用程序类,它包含一个重载的 sort() 方法,用于对不同的集合进行排序,并支持 Java 中的不同比较器。 在本文中,我们将看到如何按元素的自然顺序对 ArrayList 进行排序,然后使用比较器在 Java 中对 ArrayList 进行排序。

java.util.Collections 类提供了一个反向比较器,可用于按降序对数组进行排序。 我们可以通过调用 Collections.reverseOrder() 方法来获取此 Comparator


使用自然顺序在 Java 中对 ArrayList 进行排序

为了按照元素的自然顺序对 Java ArrayList 进行排序,存储在 ArrayList 中的对象必须在 Java 中实现一个 Comparable 接口,并且应该根据它们的自然顺序覆盖 compareTo() 方法。

在我们的 ArrayList 中自然顺序排序的例子中,我们实现了智能手机的 compareTo 并根据品牌对它们进行排序。

一旦我们的对象确定,只需将它们存储在 Java ArrayList 中并将该列表传递给 Collections.sort() 方法,该方法将按照对象的自然顺序对列表进行排序。


使用自定义顺序对 Java ArrayList 进行排序

要按自定义顺序对 Java 中的 ArrayList 进行排序,我们需要将外部比较器与 ArrayList 一起提供给 Collections.sort(List, Comparator) 方法。 compare() 方法将定义对象的排序将如何在 ArrayList 中进行。

在我们的 Java ArrayList 自定义顺序排序示例中,我们创建了一个 PriceComparator,它根据对象的价格对对象进行排序。 因此,我们可以获得存储在 ArrayList 中的最便宜或最昂贵的智能手机。

顺便说一句,通过在 ComparableComparator 类上添加 lambda 表达式、方法引用和各种实用方法(如 comparing()thenComparing() 方法),在 Java 中对 ArrayList 进行排序变得更加容易。

现在,让我们看下面的 Java 中自定义顺序的 ArrayList 排序的完整代码示例:

使用比较器按自定义顺序对 ArrayList 进行排序的 Java 程序

这是一个完整的代码示例,它使用自定义比较器按自然顺序和自定义顺序对 java 中的 ArrayList 进行排序。

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class ArrayListSortingExample {

   private static class SmartPhone implements Comparable {
        private String brand;
        private String model;
        private int price;

        public SmartPhone(String brand, String model, int price){
            this.brand = brand;
            this.model = model;
            this.price = price;
        }
      
        @Override
        public int compareTo(SmartPhone sp) {
            return this.brand.compareTo(sp.brand);
        }

        @Override
        public String toString() {
            return "SmartPhone{" + "brand=" + brand + ", model=" + model + ", price=" + price + '}';
        }
      
    }
  
    private static class PriceComparator implements Comparator{

        @Override
        public int compare(SmartPhone sp1, SmartPhone sp2) {
            return (sp1.price < sp2.price ) ? -1: (sp1.price > sp2.price) ? 1:0 ;
        }
      
    }

    public static void main(String... args) {
      
        //为 arraylist 排序示例创建对象
        SmartPhone apple = new SmartPhone("Apple", "IPhone4S",1000);
        SmartPhone nokia = new SmartPhone("Nokia", "Lumia 800",600);
        SmartPhone samsung = new SmartPhone("Samsung", "Galaxy Ace",800);
        SmartPhone lg = new SmartPhone("LG", "Optimus",500);
      
        //创建用于排序示例的 Arraylist
        ArrayList smartPhones = new ArrayList();
      
        //将对象存储到 ArrayList 中进行排序
        smartPhones.add(apple);
        smartPhones.add(nokia);
        smartPhones.add(samsung);
        smartPhones.add(lg);
      
        //根据对象的自然顺序在 Java 中对 Arraylist 进行排序
        Collections.sort(smartPhones);
      
        //按自然顺序打印排序的数组列表
        System.out.println(smartPhones);
      
        //按 Comparator 定义的自定义顺序在 Java 中对 Arraylist 进行排序
        Collections.sort(smartPhones,new PriceComparator());
      
        //按自定义顺序打印排序的数组列表
        System.out.println(smartPhones);
    
    }
}

上述代码运行结果如下

[SmartPhone{brand=Apple, model=IPhone4S, price=1000},
SmartPhone{brand=LG, model=Optimus, price=500}, 
SmartPhone{brand=Nokia, model=Lumia 800, price=600},
SmartPhone{brand=Samsung, model=Galaxy Ace, price=800}]

[SmartPhone{brand=LG, model=Optimus, price=500},
SmartPhone{brand=Nokia, model=Lumia 800, price=600},
SmartPhone{brand=Samsung, model=Galaxy Ace, price=800},
SmartPhone{brand=Apple, model=IPhone4S, price=1000}]

如何在 Java 中按降序对字符串的 ArrayList 进行排序?

ArrayList 也可以使用降序或倒序排序

Collections.reverseOrder()

Collection.reverseOrder(Comparator cmp)

前一个方法将按自然顺序的倒序排序,而后一个方法将按指定比较器的倒序排序,如以下将 ArrayList 排序为倒序的示例所示:

//在 Java 中按降序或倒序对 ArrayList 进行排序
List<String> unsortedList = Arrays.asList("abc", "bcd", "ade", "cde"); 
Collections.sort(unsortedList, Collections.reverseOrder());
System.out.println("Arraylist in descending order: " + unsortedList);

顺便说一句,如果我们正在对对象的 ArrayList 进行排序,那么我们还可以在多个字段上对它们进行排序,如该示例所示,我们已按作者和标题对 Book 对象的 ArrayList 进行排序。 这样同一作者的所有书籍都会排在第一位。


如何以不区分大小写的顺序对字符串的 ArrayList 进行排序

字符串的 ArrayList 也可以通过不区分大小写的比较来排序。 String 类定义了一个方便的不区分大小写的比较器,可以像 String.CASE_INSENSITIVE_ORDER 一样直接访问。

如果我们将此 Comparator 传递给包含 String 的 ArrayList.sort() ,那么它们将被相应地排序。

//按不区分大小写的字符串顺序对 ArrayList 进行排序
unsortedList=Arrays.asList("abc","bcd","ABC","BCD");
System.out.println("ArrayList before case insensitive sort: "+unsortedList);

Collections.sort(unsortedList,String.CASE_INSENSITIVE_ORDER);
System.out.println("ArrayList after case insensitive sort: "+unsortedList);

这就是关于如何使用 Custom Comparator 根据 Object 的自然顺序和任何自定义顺序对 Java 中的 ArrayList 进行排序的全部内容。 在 Java 中比较和排序对象时,这是一种有用的技术。 比较器为我们提供了强大的功能和对排序的细粒度控制。

Java 8 对 Comparator API 的增强使它更加流行,通过使用这些功能,我们可以轻松创建更具可读性和可重用性的 Comparator

如果大家在 Java 中运行排序 ArrayList 示例代码时遇到任何问题,请告诉我们,我很乐意为大家提供帮助。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Do you understand JavaScript closures?

发布时间:2025/02/21 浏览次数:108 分类:JavaScript

The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.

Do you know about the hidden traps in variables in JavaScript?

发布时间:2025/02/21 浏览次数:178 分类:JavaScript

Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av

How much do you know about the Prototype Chain?

发布时间:2025/02/21 浏览次数:150 分类:JavaScript

The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start

JavaScript POST

发布时间:2024/03/23 浏览次数:96 分类:JavaScript

本教程讲解如何在不使用 JavaScript 表单的情况下发送 POST 数据。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便