使用 Java Streams 对 int 数组进行排序

cur*_*eer 0 java java-stream

我试图熟悉 Java 流以及该领域的类似事物,但无法对 type 的数组进行排序int。这是我的代码,它根本不对数组进行排序。

class Scratch {
   public static void main(String[] args) {
       int [] arr3 = { 9,21,5,8 };
       Comparator<Integer> cc = (e1,e2) -> {
            return e1.compareTo(e2);
       };
       Arrays.stream(arr3).boxed().sorted();
       System.out.println(Arrays.toString(arr3));
   }
}
Run Code Online (Sandbox Code Playgroud)

Bor*_*dov 5

我观察到您的代码打印未排序数组的引用,而它应该将排序数组分配给一个新变量并打印它。此外,您定义的比较器未被使用,也不是代码功能所必需的。

原始数组无法更改 Java 流。Java 流处理不可更改的数据并生成新数据而不是修改原始数据。因此,如果使用 Java 流排序,则需要创建一个新的排序数组。如果要更改原始数组,请使用常用的 Arrays.sort() 方法对其进行排序。

以下是两种固定且有效的方法,以及更多:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

class Scratch {
  public static int[] UNSORTED_ARR = {9, 21, 5, 8};

  public static void main(String[] args) {
    sort1();
    sort2();
    sort3();
    sort4();
    sort5();
  }

  /**
   * Sort using comparator and streams
   */
  private static void sort1() {
    System.out.println("Sort using comparator and streams");
    Comparator<Integer> comparator = Integer::compareTo;
    var sortedStream = Arrays.stream(UNSORTED_ARR).boxed().sorted(comparator).toArray();
    System.out.println(Arrays.toString(sortedStream));
  }

  /**
   * Sort using sorted() method and streams
   */
  private static void sort2() {
    System.out.println("Sort using sorted() method and streams");
    var sortedStream = Arrays.stream(UNSORTED_ARR).sorted().toArray();
    System.out.println(Arrays.toString(sortedStream));
  }


  /**
   * Sort using sorted() method and collect list with streams
   */
  private static void sort3() {
    System.out.println("Sort using sorted() method and collect list with streams");
    List<Integer> sortedList = Arrays.stream(UNSORTED_ARR)
        .sorted()
        .boxed()
        .collect(Collectors.toList());
    System.out.println(sortedList);
  }

  /**
   * Sort using reverseOrder() method and streams
   */
  private static void sort4() {
    System.out.println("Reverse sort using reverseOrder() method and streams");
    int[] sortedArr = Arrays.stream(UNSORTED_ARR)
        .boxed()
        .sorted(Comparator.reverseOrder())
        .mapToInt(Integer::intValue)
        .toArray();
    System.out.println(Arrays.toString(sortedArr));
  }


  /**
   * Sort using Arrays.sort()
   * This modifies the original array and not using streams
   */
  private static void sort5() {
    System.out.println("Sort using Arrays.sort()");
    Arrays.sort(UNSORTED_ARR);
    System.out.println(Arrays.toString(UNSORTED_ARR));
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Sort using comparator and streams
[5, 8, 9, 21]
Sort using sorted() method and streams
[5, 8, 9, 21]
Sort using sorted() method and collect list with streams
[5, 8, 9, 21]
Reverse sort using reverseOrder() method and streams
[21, 9, 8, 5]
Sort using Arrays.sort()
[5, 8, 9, 21]
Run Code Online (Sandbox Code Playgroud)