【发布时间】:2021-09-20 01:52:37
【问题描述】:
我实现了一个数组,其中我采用了一个零索引数组。 考虑下面的数组:
Array : X S T U A C D B F H
Index : 0 1 2 3 4 5 6 7 8 9
After sorting this array :
Array : A B C D F H S T U X
Index : 0 1 2 3 4 5 6 7 8 9
Original indices : 4 7 5 6 8 9 1 2 3 0
之前的 A 位于索引 4 处,但在排序后的数组中,它位于索引 0 处,其他值也相同。 程序的预期输出表示为原始索引。我不想打印排序数组中的元素,而是想在排序后打印它们的原始索引。
虽然这段代码工作正常,但我想知道是否有任何其他简单的技术可以在不使用 Comparator 的情况下保留原始数组索引。这里的想法是保留索引,因此我使用的是 Comparator :
在这个比较器中,我保留了要排序的实际数组。此外,如果您注意到, compare 方法会根据提供给它的索引来比较实际数组的值。这里的关键是提供索引而不是要排序的实际值。
S 是要排序的字符数组,indexArray 是辅助数组。在排序之前,索引数组将包含序列中的数字 0 - 要排序的数组的长度。当我在索引数组上调用 Arrays.sort 方法时,它会将两个索引传递给 compare 方法并比较存储在这些索引处的值。
```public class ArrayIndexComparator implements Comparator<Integer>
{
private final Character[] A;
public ArrayIndexComparator(Character[] arr)
{
this.A = arr;
}
public int compare(Integer o1, Integer o2)
{
return A[o1].compareTo(A[o2]);
}
}```
```public static void main(String[] args)
{
Character[] S = new Character[]{'X','S','T','U','A','C','D','B','F','H'};
Integer[] indexArray = new Integer[S.length];
IntStream.range(0, S.length).forEach(val -> indexArray[val] = val);
ArrayIndexComparator comp = new ArrayIndexComparator(S);
Arrays.sort(indexArray, comp);
System.out.println(Arrays.toString(indexArray));
}```
【问题讨论】:
-
注意 java 命名约定。变量名应以小写字符开头
-
您为什么要这样做?您的比较器方法是一种非常合理的方法,它具有清晰和自我记录的区别。
标签: java arrays performance sorting java-8