在 Java 中对数组进行排序

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(275)   2023-06-26 07:54:18

ComparableComparator 接口、数组.sort()Stream.sorted() API。

我们将学习按自然顺序逆序和任何其他自定义顺序对数组进行排序。

1. 数组排序基础

无论我们使用哪种 Java API 进行排序,排序功能背后的基本概念都保持不变

  • 所有内置 API 均支持默认自然顺序排序。数值类型按升序排序,字符串按字典顺序排序(字典顺序),自定义对象按 Comparable 接口实现的顺序排序。
  • 要按倒序排序,我们可以在排序方法中使用Comparator.reverseOrder()
  • 要按自定义顺序 进行排序,我们必须创建一个Comparator 接口的实例,并在其中提供相关的排序行为。然后我们将比较器的一个实例传递给排序 API。

现在让我们深入研究演示数组排序的 Java 程序。对于自定义排序,我们将使用 User 类的实例。请注意,id 字段支持默认排序。

public class User implements Comparable<User> {

  public long id;
  public String firstName;
  public String lastName;

  //Add getters and setters

  @Override
  public int compareTo(final User user) {
    if(user == null ) {
      return -1;
    } else {
      return (int)(this.id - user.id);
    }
  }
}

2. Arrays.sort() 和 Arrays.parallelSort()

java.util.Arrays 类提供了许多实用程序 static 方法。 sort() API 也是帮助对给定项目数组进行排序的此类方法。

sort() API 实现是一种稳定、自适应、迭代的mergesort,当输入数组部分排序时,它需要的比较次数远少于 n lg(n) 次。当输入数组随机排序时,它提供了传统归并排序的性能。如果输入数组几乎已排序,则实现需要大约 n 次比较。

parallelSort() API 实现是一种双枢轴 quicksort,可在所有数据集上提供 O(n log(n)) 性能,并且通常比传统方法更快(单轴)快速排序实现。

public static void sort(array, ?comparator)

public static void parallelSort(array, ?comparator)

2.1.按自然顺序排序

Java 程序以默认顺序对 String 数组进行排序。请注意,String 类已经实现了 Comparable 接口。

String[] tokens = {"A","C","B","E","D"};

Arrays.sort(tokens);         //[A, B, C, D, E]

2.2.倒序排序

Java 程序使用 Comparator.reverseOrder() 来反转自然顺序。

String[] tokens = {"A","C","B","E","D"};

Arrays.sort(tokens, Collections.reverseOrder());           //[E, D, C, B, A]

2.3.自定义排序

我们按名字对用户数组进行排序。

User[] users = getUsersArray();

Comparator firstNameSorter = Comparator.comparing(User::getFirstName);
Arrays.sort(users, firstNameSorter);

要对多个字段进行排序,例如 SQL group by clause,我们可以创建一个复杂的Comparator实例并将其用于排序目的。

Comparator fullNameSorter = Comparator.comparing(Employee::getFirstName)
	.thenComparing(Employee::getLastName);

Arrays.sort(employees, fullNameSorter);

3. 使用 Stream API 对数组进行排序

我们可以使用 Stream.sorted() 方法对基元数组或自定义对象进行排序,其方式与我们使用 Arrays.sort() API 的方式非常相似。

  • sorted() API 返回一个流,该流由该流的元素组成,并根据自然顺序排序。
  • 如果此流的元素不是Comparable,则在执行终端操作时可能会抛出java.lang.ClassCastException
  • 它还接受一个可选的比较器实例,用于实现自定义排序行为。

对于有序流(流是从有序集合生成的,例如 ArrayList),排序是稳定的。对于无序流(例如,从 HashMap 生成的流),不提供稳定性保证。

Stream<T> sorted()

Stream<T> sorted(?comparator)
//1. Natural ordering

User[] sortedUserArray = Stream.of(userArray)
            .sorted()
            .toArray(User[]::new);

//2. Reverse ordering

User[] sortedUserArray = Stream.of(userArray)
            .sorted(Comparator.reverseOrder())
            .toArray(User[]::new);

//3. Custom Sorting

Comparator nameComparator = Comparator.comparing(Employee::getName)
	.thenComparing(Employee::getId)

User[] sortedUserArray = Stream.of(userArray)
            .sorted(nameComparator)
            .toArray(User[]::new);

4.总结

在这个给定的示例中,我们学习了使用 Arrays.sort() 和 Stream API 对数组进行排序。我们学会了按自然顺序、倒序和自定义顺序排序。

快乐学习!!

标签2: Java Sorting
地址:https://www.cundage.com/article/java-array-sorting.html

相关阅读

通过一些示例了解如何使用 Collections.sort() 方法对对象列表进行排序。 默认情况下,sort() 方法将给定列表按升序(或自然顺序)排序。我们可以使用 Collections....
按字母顺序对 String 的字符进行排序 的 Java 示例 – 使用 Stream.sorted() 和 Arrays.sort() 方法。 1) 使用 Stream API 对字符串进行排...
在 Comparable 和 Comparator 接口、数组.sort() 和 Stream.sorted() API。 我们将学习按自然顺序、逆序和任何其他自定义顺序对数组进行排序。 1. ...
Spring Boot Data JPA 排序教程展示了如何在 Spring Data JPA 中对查询结果进行排序。查询结果使用 ORDER BY 子句或 Sort 对象进行排序。 春天 是一...
使用 Java 8 Stream API 以升序和降序(反向)顺序按值对 Map 进行排序 的简单快速使用示例。 逻辑的中心是方法 Map.Entry.comparingByValue(),它按...
学习按字段值对对象列表进行排序。请注意,如果您一次有数百万条记录需要排序,那么数据库查询是最好的方法。否则,使用 Comparable 或 Comparator 接口是一种非常方便的方法。 1....
插入排序 是一种简单而缓慢的排序算法,它反复从未排序的部分中取出下一个元素,并将其插入到已排序部分的正确位置。 插入排序的思想来源于我们的日常生活经验。例如,当你和朋友一起玩牌时,你会把你挑选的...
在本文中,我们使用 Java 流。 Java流定义 溪流 是来自支持顺序和并行聚合操作的源的元素序列。常见的聚合操作有:filter、map、reduce、find、match、sort。源可以...
冒泡排序是一种简单而缓慢的排序算法,它重复遍历集合,比较每对相邻元素,如果顺序错误则交换它们。在排序算法中,如果我们观察阶数较高(即值较大)的元素的移动,它们就像水中的气泡,从底部慢慢地漂浮到顶...
在计算机科学中,合并排序(通常也拼写为 mergesort)是一种基于O(n log n) 比较的排序算法。大多数实现会生成一个稳定排序,这意味着该实现保留了排序输出中相等元素的输入顺序。 归并...