java - 排序后获取数组的索引?

标签 java

假设用户输入一个数组,例如:

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

提前致谢

最佳答案

不要对数组进行排序。对索引数组进行排序,传入一个比较器,该比较器使用数组中的 as 索引来比较值。所以你最终得到 newIndex 作为排序的结果,从那里到实际项目的排序数组是微不足道的。

诚然,这意味着以自定义方式对整数数组进行排序 - 这意味着使用 Integer[] 和标准 Java 库,或者具有“IntComparator”接口(interface)的第 3 方库可以与 sort(int[], IntComparator) 类型的方法结合使用。

编辑:好的,这是一个示例比较器。为简单起见,我假设您只想对“原始”字符串数组进行排序......我不会为空值测试而烦恼。

public class ArrayIndexComparator implements Comparator<Integer>
{
    private final String[] array;

    public ArrayIndexComparator(String[] array)
    {
        this.array = array;
    }

    public Integer[] createIndexArray()
    {
        Integer[] indexes = new Integer[array.length];
        for (int i = 0; i < array.length; i++)
        {
            indexes[i] = i; // Autoboxing
        }
        return indexes;
    }

    @Override
    public int compare(Integer index1, Integer index2)
    {
         // Autounbox from Integer to int to use as array indexes
        return array[index1].compareTo(array[index2]);
    }
}

你会这样使用它:

String[] countries = { "France", "Spain", ... };
ArrayIndexComparator comparator = new ArrayIndexComparator(countries);
Integer[] indexes = comparator.createIndexArray();
Arrays.sort(indexes, comparator);
// Now the indexes are in appropriate order.

关于java - 排序后获取数组的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4859261/

相关文章:

java - 在扩展类中使用此 VS setter

java - 验证来自 Android 应用程序的后端调用

java - 没有 MapActivity 的 MapView

java - 如何使用 Java 将文件传递给 Jenkins

javascript - Nashorn 使用 Array.from(string) 给出错误

Java HotSpot(TM) 64 位服务器 VM 警告、CentOS、SmartGit、SmartSvn

java - 使用 spring-ldap 1.3.1 禁用 Active Directory 服务器的 SSL 证书验证

java - 无法解析 WSDL

java - Confluent Cloud 上的 Kafka 流 : 'segment.ms' with value '600000' exceeded min limit of 14400000 for internal repartition topic

java - 无法在 STS 版本 4.5.0 中添加 java 11 jre