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

24 篇文章 0 订阅

在 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 示例代码时遇到任何问题,请告诉我们,我很乐意为大家提供帮助。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迹忆客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值