假设用户输入一个数组,例如:
Array = {France, Spain, France, France, Italy, Spain, Spain, Italy}
我知道它的长度index
数组将是:
index = {0, 1, 2, 3, 4, 5, 6, 7}
现在,使用Arrays.sort(Array);
对其排序后newArray
将类似于:
newArray = {France, France, France, Italy, Italy, Spain, Spain, Spain}
并且newIndex
将为:
newIndex = {0, 2, 3, 4, 7, 1, 5, 6}
问题是:如何从输入数组中找到newIndex
?
8条答案
按热度按时间baubqpgj1#
不要一开始就对数组进行排序,而是对索引数组进行排序,传入一个比较器,该比较器通过将值作为索引来比较数组中的值,所以最后得到
newIndex
作为排序的结果,从那里到实际项的排序数组是很简单的。诚然,这意味着以自定义的方式对整数数组进行排序-这意味着使用
Integer[]
和标准Java库,或者使用具有“IntComparator”接口的第三方库,该接口可以与sort(int[], IntComparator)
类型的方法结合使用。编辑:好的,这里有一个比较器的例子,为了简单起见,我假设你只想对一个“原始”的字符串数组排序......我不想再做空值测试了。
你可以这样使用它:
h43kikqp2#
使用API实现此目的的简洁方法,
n6lpvg4x3#
现在迭代map.values()以按排序顺序检索索引,迭代map.keySet()以获取字符串,或者迭代map.entrySet()以获取String-index-Pairs。
yhqotfr84#
如果有一个重复排序带正值的基元float或int数组的场景,那么下面的方法比使用任何比较器都能产生更好的(x3~x4)速度:
ux6nzvsh5#
我根据@Skeet的代码做了下面的代码。我觉得它有点太OOPie了。我不知道。
不是实现排序和索引的类为不同的对象提供Comparator代码,而是原始数组中的对象必须实现Comparable接口,看起来很多感兴趣的对象都有自然的排序,并且已经实现了Comparable接口。
jm2pwxwz6#
一种方法是将原始索引和国家名称 Package 到一个单独的类中,然后根据名称对Array进行排序。这样,原始索引将被保留。
gk7wooem7#
第一眼看到的是这样的Map
然后按值like that对它们进行排序,然后您可以知道它们的索引和值(键、值),只需打印Map
mf98qq948#
我找到了解决办法。
如果
a
排序像这样
结果