public static void sortIntArray(int[] arr, ToIntFunction<Integer> c) {
Integer[] ints = new Integer[arr.length];
Arrays.setAll(ints, i -> arr[i]);
Arrays.sort(ints, Comparator.comparingInt(c));
Arrays.setAll(arr, i -> ints[i]);
}
您还可以使用 Stream API 并返回一个新的排序数组,但请注意,它IntStream也不支持自定义排序,您必须Stream<Integer>使用以下方法将其转换为然后再返回Stream::mapToInt:
使用比较器对数组进行排序不适用于原始类型的数组
int[],long[]等等double[],因此对于自定义排序,您必须将数组转换为列表List<Integer>或数组Integer[],使用方法对其进行排序Arrays.sort(T[] arr, Comparator<? super T>) c,然后将其转换回原语数组。在这种情况下,您应该传递一个函数来转换为原语,而不是比较器,
Integer在此基础上您可以使用 构建比较器Comparator.comparingInt(ToIntFunction<? super T>) fn。您还可以使用 Stream API 并返回一个新的排序数组,但请注意,它
IntStream也不支持自定义排序,您必须Stream<Integer>使用以下方法将其转换为然后再返回Stream::mapToInt:测试:
结论:
同样,您可以传递一个用于自定义排序的方法
IntUnaryOperator,该方法接收并返回 type 的结果int,然后在调用比较器时,您需要传递一个指向相应方法的链接IntUnaryOperator::applyAsInt:Java 中有一个棘手的问题:您无法使用比较器对基元数组进行排序。标准库提供的方法涉及数组内容的两个副本。您将数据复制到数组或对象集合中,对其进行排序,然后将其复制回来。我想解决问题而不复制。
有这样一种方法:让我们创建一个
AbstractList看起来像列表的后继者Integer,但将数据存储在数组中。如果这样的后继被排序,则存储数据的数组将被排序。一切正常:
如果你不怕匿名类,代码可以写得更短: