返回未排序列表的第n个最高值的索引

时间:2017-04-27 15:03:10

标签: java arrays list search indexing

我已编写以下代码,现在正试图找出实现四条评论中解释的最佳方法:

    Integer[] expectedValues = new Integer[4];

    for (int i = 0; i <= 3; i++) {
        expectedValues[i] = getExpectedValue(i);
    }

    int choice = randomNumGenerator.nextInt(100) + 1;
    if (choice <= intelligence) {
        // return index of highest value in expectedValues
    } else if (choice <= intelligence * 2) {
        // return index of 2nd highest value in expectedValues
    } else if (choice <= intelligence * 3) {
        // return index of 3rd highest value in expectedValues
    } else {
        // return index of lowest value in expectedValues
    }

这样做会有什么优雅的方式?我不需要将期望值保持为数组 - 我很乐意使用任何数据结构。

3 个答案:

答案 0 :(得分:1)

您可以创建一个包含索引的新数组并对值进行排序 - 在半伪代码中它可能看起来像这样(需要调整):

int[][] valueAndIndex = new int[n][2];

//fill array:
valueAndIndex[i][0] = i;
valueAndIndex[i][1] = expectedValues[i];

//sort on values in descending order
Arrays.sort(valueAndIndex, (a, b) -> Integer.compare(b[1], a[1]));

//find n-th index
int n = 3; //3rd largest number
int index = valueAndIndex[n - 1][0];

答案 1 :(得分:0)

如果您想使用简单数组,也许这可能是一个解决方案:

public static void main(String[] args) {
    int[] arr = new int[] { 1, 4, 2, 3 };
    int[] sorted = sortedCopy(arr);

    int choice = randomNumGenerator.nextInt(100) + 1;
    if (choice <= intelligence) {
        System.out.println(findIndex(arr, sorted[3])); // 1
    } else if (choice <= intelligence * 2) {
        System.out.println(findIndex(arr, sorted[2])); // 3
    } else if (choice <= intelligence * 3) {
        System.out.println(findIndex(arr, sorted[1])); // 2
    } else {
        System.out.println(findIndex(arr, sorted[0])); // 0
    }
}

static int[] sortedCopy(int[] arr) {
    int[] copy = new int[arr.length];
    System.arraycopy(arr, 0, copy, 0, arr.length);
    Arrays.sort(copy);
    return copy;
}

static int findIndex(int[] arr, int val) {
    int index = -1;
    for (int i = 0; i < arr.length; ++i) {
        if (arr[i] == val) {
            index = i;
            break;
        }
    }
    return index;
}

答案 2 :(得分:0)

你可以“消灭”最高值n-1次。在此之后,最高值是原始数组的第n个最高值:

public static void main(String[] args) {
    int[] numbers = new int[]{5, 9, 1, 4};
    int n = 2; // n-th index

    for (int i = 0; i < n - 1; ++i) {
        int maxIndex = findMaxIndex(numbers);
        numbers[maxIndex] = Integer.MIN_VALUE;
    }

    int maxIndex = findMaxIndex(numbers);
    System.out.println(maxIndex + " -> " + numbers[maxIndex]);
}

public static int findMaxIndex(int[] numbers) {
    int maxIndex = 0;
    for (int j = 1; j < numbers.length; ++j) {
        if (numbers[j] > numbers[maxIndex]) {
            maxIndex = j;
        }
    }
    return maxIndex;
}

复杂性为O(n * numbers.length)