简体   繁体   English

Java-以int数组的升序获取索引

[英]Java - Obtain the indexes in ascending order of an int array

I have an int array as [2,4,1,0,0,3] and need to obtain from that an array of the indexes in ascending order, means [3,4,2,0,5,1]. 我有一个[2,4,1,0,0,3]的int数组,需要从中获取升序的索引数组,表示[3,4,2,0,5,1]。

I tried to resolve this by using a sorted array to get the numbers in order, then iterating over the original array to find the index when a match happens. 我尝试通过使用排序数组来按顺序获取数字来解决此问题,然后在发生匹配时遍历原始数组以查找索引。 As follows: 如下:

public class IndexAscendingSorter {
    public static void main (String[] args) {
        int[] array = {2,4,1,0,0,3};
        IndexAscendingSorter finder = new IndexAscendingSorter();
        int[] indixes = finder.orderIndexAscending(array);

        System.out.println("Indexes of the array in ascending order: " +
                            Arrays.toString(indixes));
    }

    public int[] orderIndexAscending(int[] array) {
        int[] minimumIndexes = new int[array.length];
        int[] sortedArray = array.clone();
        Arrays.sort(sortedArray);

        for (int index = 0; index < array.length; index++){
            int minIndex = 0;
            for (int number : array) {
                if (number == sortedArray[index]) { 
                    minimumIndexes[index] = minIndex;
                    break;
                }
                minIndex++;
            }
        }
        return minimumIndexes;
    }
}

The problem is that for same numbers don't return the correct indexes, the output of executing that code is: 问题在于,对于相同的数字不会返回正确的索引,执行该代码的输出为:

Indexes of the array in ascending order: [3, 3, 2, 0, 5, 1] The second value array[1] should have been 4 instead of 3. Does anyone know how can I improve this? 数组的索引以升序排列:[3、3、2、0、5、1]第二个值array [1]应该是4而不是3。有人知道如何改善这一点吗?

Continuing with your approach, a quick solution would be to use a hash set where you will add the indexes you have already used, and then can check if it is a repeated index. 继续您的方法,一种快速的解决方案是使用哈希集,在其中您将添加已经使用的索引,然后可以检查它是否是重复索引。 Just change the orderIndexAscending() function to: 只需将orderIndexAscending()函数更改为:

    public int[] orderIndexAscending(int[] array) {
        int[] minimumIndexes = new int[array.length];
        int[] sortedArray = array.clone();
        Arrays.sort(sortedArray);
        Set<Integer> savedIndexes = new HashSet<>();

        for (int index = 0; index < array.length; index++){
            int minIndex = 0;
            // Add the index in ascending order, we need to keep the indexes already
            // saved, so won't miss indexes from repeted values
            for (int number : array) {
                if (number == sortedArray[index] && !savedIndexes.contains(minIndex)) { 
                    savedIndexes.add(minIndex);
                    minimumIndexes[index] = minIndex;
                    break;
                }
                minIndex++;
            }
        }
        return minimumIndexes;
    }
}

Pair the numbers with their original indices: 将数字与原始索引配对:

[2,4,1,0,0,3] => [[2,0],[4,1],[1,2],[0,3],[0,4],[3,5]]]

Then sort by the original value: 然后按原始值排序:

=> [[0,3],[0,4],[1,2],[2,0],[3,5],[4,1]]]

And lastly extract the indices: 最后提取索引:

=> [3,4,2,0,5,1]

将索引数组初始化为Integers 0、1、2、3,...,然后使用自定义编译器对索引数组进行排序,该自定义编译器查找相应的数组值并进行比较。

 for (int index = 0; index < array.length; index++){
        int minIndex = 0;
        for (int number : array) {
            if (number == sortedArray[index]) { 
                minimumIndexes[index] = minIndex;
                array[minIndex]=Integer.MAX_VALUE;
                break;
            }
            minIndex++;
        }
    }

You can simply update already visited value with any value never present in the array. 您可以简单地使用数组中从未存在的任何值来更新已访问的值。

You may simply update the value that has already been visited with any value that is not present in the array. 您可以简单地使用数组中不存在的任何值来更新已经访问过的值。

for (int index = 0; index < array.length; index++){
    int minIndex = 0;
    for (int number : array) {
        if (number == sortedArray[index]) { 
            minimumIndexes[index] = minIndex;
            array[minIndex]=Integer.MAX_VALUE;
            break;
        }
        minIndex++;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM