Arrays.sort(sa, Comparator.comparing(i -> rank[i])); 这个 语句是怎么排序
时间: 2024-03-04 12:50:53 浏览: 22
这个语句使用了 Java 8 引入的 Lambda 表达式和 Comparator 接口,可以将后缀数组 `sa` 按照其对应的排名数组 `rank` 的大小进行排序。
具体来说,`Comparator.comparing(i -> rank[i])` 返回了一个比较器,该比较器会根据后缀数组 `sa` 中每个位置对应的排名数组 `rank` 的大小来进行比较。Lambda 表达式 `i -> rank[i]` 将后缀数组中的每个位置 `i` 映射到其对应的排名数组 `rank` 中的值。`Comparator.comparing` 方法则接受这个映射函数,并返回一个比较器,该比较器会按照映射函数的结果进行比较。
最后,`Arrays.sort` 方法接受后缀数组 `sa` 和比较器对象,并将 `sa` 按照比较器的规定进行排序。排序后,`sa` 中每个位置对应的后缀都按照字典序排列。
需要注意的是,这里使用的是稳定排序算法,因为在后缀数组中可能存在相同的后缀(例如字符串的前缀),这些后缀需要按照它们出现的顺序来进行排序,否则可能导致后面的 LCP 计算出现错误。稳定排序算法可以保证相同的元素在排序后仍然按照它们原来的顺序排列。
相关问题
Arrays.stream(a).sorted(Comparator.comparing(Winshop -> Winshop[1]));Winshop -> Winshop[1]是什么意思
Winshop -> Winshop[1]是Java 8中的Lambda表达式,表示对于数组a中的每个元素Winshop,按照Winshop的第二个元素进行排序。其中“->”表示Lambda运算符,左边的Winshop是输入参数,右边的Winshop[1]是返回值。
arrays.sort重写comparator
当使用`Arrays.sort`对数组进行排序时,可以通过重写`Comparator`接口来自定义排序规则。以下是一个示例:
```java
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
Integer[] numbers = {5, 2, 10, 1, 8};
// 使用自定义的Comparator进行排序
Arrays.sort(numbers, new CustomComparator());
// 打印排序后的数组
System.out.println(Arrays.toString(numbers));
}
static class CustomComparator implements Comparator<Integer> {
@Override
public int compare(Integer num1, Integer num2) {
// 自定义排序规则,按照数字大小倒序排序
return num2 - num1;
}
}
}
```
在上述示例中,我们创建了一个名为`CustomComparator`的内部类,实现了`Comparator<Integer>`接口。在`compare`方法中,我们可以根据自己的需求定义排序规则。在这个例子中,我们按照数字的大小倒序排序。
然后,我们使用`Arrays.sort`方法并传入自定义的比较器对象`CustomComparator`来对数组进行排序。最后,通过打印数组来验证排序结果。
请注意,如果要对其他类型的对象进行排序,只需将`Integer`替换为相应的类型,并相应地修改比较逻辑即可。