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

时间:2018-09-17 03:47:13

标签: java arrays sorting

我有一个[2,4,1,0,0,3]的int数组,需要从中获取升序的索引数组,表示[3,4,2,0,5,1 ]。

我试图通过使用排序数组来按顺序获取数字来解决此问题,然后在发生匹配时遍历原始数组以查找索引。如下:

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;
    }
}

问题在于,对于相同的数字不会返回正确的索引,执行该代码的输出为:

  

数组的索引按升序排列:[3、3、2、0、5、1]   第二个值array [1]应该是4而不是3。有人知道我该如何改善?

5 个答案:

答案 0 :(得分:1)

继续您的方法,一种快速的解决方案是使用哈希集,在其中您将添加已经使用的索引,然后可以检查它是否是重复索引。只需将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;
    }
}

答案 1 :(得分:1)

将数字与原始索引配对:

5th

然后按原始值排序:

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

最后提取索引:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

 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++;
        }
    }

您可以简单地使用数组中从未存在的任何值来更新已访问的值。

答案 4 :(得分:0)

您可以简单地使用数组中不存在的任何值来更新已经访问过的值。

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++;
    }
}