我正在尝试熟悉 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 流处理不可更改的数据并生成新数据而不是修改原始数据。因此,如果使用 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]
每次创建
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);
};
要解决这个问题,您需要几个步骤 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));