乐趣区

关于后端:面试题精讲Java-Stream排序的实现方式

首发博客地址

系列文章地址


如何应用 Java Stream 进行排序

在 Java 中,应用 Stream 进行排序能够通过 sorted() 办法来实现。sorted()办法用于对 Stream 中的元素进行排序操作。具体实现如下:

  1. 对根本类型元素的排序:

    • 应用 sorted() 办法对 Stream 进行排序,默认是依照天然程序进行排序。例如,对一个 Stream<Integer> 进行排序能够如下操作:

      Stream<Integer> stream = Arrays.stream(new Integer[] {3, 1, 2});
      Stream<Integer> sortedStream = stream.sorted();
      sortedStream.forEach(System.out::println);

      输入后果是:1, 2, 3。

    • 如果想要依照特定的程序进行排序,能够应用 sorted(Comparator) 办法,并传入一个自定义的比拟器。例如,对一个 Stream<String> 依照长度进行排序能够如下操作:

      Stream<String> stream = Stream.of("apple", "banana", "cherry");
      Stream<String> sortedStream = stream.sorted(Comparator.comparingInt(String::length));
      sortedStream.forEach(System.out::println);

      输入后果是:apple, cherry, banana。

  2. 对自定义对象的排序:

    • 对于自定义对象,能够通过实现 Comparable 接口来定义对象的天然排序形式。而后,在 sorted() 办法中间接调用,就会依照天然排序进行排序。
    • 如果想要依照其余形式进行排序,能够应用 sorted(Comparator) 办法,并传入一个自定义的比拟器。

      public class Person implements Comparable<Person> {
          private String name;
          private int age;
      
          // 省略构造方法和其余代码
      
          @Override
          public int compareTo(Person other) {return Integer.compare(this.age, other.age);
          }
      }
      
      // 应用天然排序形式
      Stream<Person> stream = persons.stream();
      Stream<Person> sortedStream = stream.sorted();
      sortedStream.forEach(System.out::println);
      
      // 应用自定义比拟器进行排序
      Stream<Person> stream = persons.stream();
      Stream<Person> sortedStream = stream.sorted(Comparator.comparingInt(Person::getAge));
      sortedStream.forEach(System.out::println);

以上就是应用 Java Stream 进行排序的根本实现形式。能够依据具体的排序需要,抉择适合的排序办法和比拟器。

外部是什么算法实现的

Java Stream 中的排序操作应用了一种稳固的归并排序算法来实现。归并排序是一种分治算法,将待排序的元素序列递归地分成两半,而后对每个子序列进行排序,最初将两个有序的子序列合并成一个有序的序列。

具体来说,Java Stream 的排序操作应用了一种优化的归并排序算法,被称为 ”timsort”。”timsort” 算法联合了归并排序和插入排序的长处,以进步排序效率和性能。

“timsort” 算法的次要特点包含:

  1. 自适应的排序策略:”timsort” 算法会依据待排序的数据特色,主动抉择适合的排序策略。对于曾经局部有序的序列,”timsort” 算法会利用已有的有序信息,采纳插入排序来减速排序过程。
  2. 分段排序:”timsort” 算法首先将待排序的序列划分为若干个较小的块,而后对每个块应用插入排序进行排序。这样能够缩小插入排序的比拟和替换次数,进步排序效率。
  3. 归并操作:”timsort” 算法应用归并操作将排序后的小块合并成较大的块,直到最终将整个序列合并成一个有序序列。归并操作保障了最终后果的有序性。

“timsort” 算法在解决大规模数据时具备较高的效率和稳定性,尤其实用于解决曾经局部有序或具备反复元素的序列。

须要留神的是,Java Stream 的排序操作默认应用天然排序(自定义对象须要实现 Comparable 接口),但也能够通过传入自定义的比拟器来指定其余排序形式。无论应用哪种排序形式,底层的排序算法都是基于 ”timsort” 实现的。

本文由 mdnice 多平台公布

退出移动版