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

问题描述 投票:0回答:3

我正在尝试熟悉 Java 流以及该领域的类似事物,但无法对

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));
   }
}
java java-stream
3个回答
4
投票

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

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));
  }
}

输出:

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]

0
投票

每次创建

Stream
时,都会创建另一个对象。因此,您必须将排序流的结果分配给变量并将其转换为像
List
这样的数据结构。

class Scratch {
   public static void main(String[] args) {
       int [] arr3 = { 9, 21, 5, 8 };
       List<Integer> sorted = Arrays.stream(arr3).boxed().sorted().toList();
       System.out.println(Arrays.toString(sorted));
   }
}

在这种情况下,不需要定义比较器,因为当您调用

sorted
时,默认比较器是数据类型为
Integer
的比较器。

       Comparator<Integer> cc = (e1,e2) -> {
            return e1.compareTo(e2);
       };

0
投票

要解决这个问题,您需要几个步骤 1-您需要将其转换为插播 2-然后使用stream API sort函数进行排序 3-转换回普通数组

int [] arr3 = { 9, 21, 5, 8 };
System.out.println(Arrays.toString(arr3));
//convert this to array of stream
IntStream intStream = Arrays.stream(arr3);
intStream = intStream.sorted();
//convert it to array
arr3 = intStream.toArray();
System.out.println(Arrays.toString(arr3));
© www.soinside.com 2019 - 2024. All rights reserved.