我实现了一个数组,其中一个数组的索引为零。考虑下面的数组:
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:
在这个比较器中,我保留了要排序的实际数组。另外,如果您注意到,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));
}```
3条答案
按热度按时间v9tzhpje1#
你可以这样做。
根据字符串对索引进行排序
然后使用
Arrays.setAll
构造已排序的字符数组。印刷品
r6l8ljro2#
至少有两种方法可以避免使用自定义项
Comparator
按索引而不是值排序,但它们并不简单,我强烈建议不要使用它们——我在这里介绍这个主题是出于兴趣。第一个想法是创建一个结合原始值的代理值
Character
值及其索引,例如,将该值乘以数组的长度n
并添加索引。在此代理项值上排序后,通过mod
n
获取索引。输出:
这里明显的问题是在大数组和/或字符的情况下出现溢出。
另一个选项是使用Map存储字符的原始位置,并在对原始数组排序后执行查找。
输出:
这里的问题是不允许重复。
92vpleto3#
使用comparator.comparating可以更轻松地定义比较器。