如何获取整数数组中的最小三个元素

5

嗨,我想要获取数组中最小的三个元素。这里的“最小”指的是最小值。由于需要知道元素的索引,所以无法使用 collections.Sort 方法。因此,我正在使用以下代码获取最小值,但我需要知道如何获取最小的三个元素。

int minimum = grades[1];
int index = 1;

for(i=1; i<= numberOfStudents; i++){
    if (grades[i]<minimum){
        minimum = grades[i];
        index = i;
    }
}

5
为什么你把数组索引从1开始? - Clark
可能有更好的方法,但我会按你想要的值对其进行排序,然后只获取排序数组的前3个。 - Throttlehead
1
只需复制数组并对其进行排序。或者在循环时跟踪3个元素而不是1个。基本编程 :p - keyser
@Clark - 因为第一个元素与我需要实现的目标无关。 - M9A
Java在这种情况下可能会很啰嗦。例如,在Scala中,可以用一行代码解决这个问题。val lowestThreeIndices = grades.zipWithIndex.sorted.take(3).map(_._2) - Tesseract
显示剩余3条评论
5个回答

4
这里有一个非常简单的方法来实现它:
public static void main(String[] args) {
    int[] myArray = { 5, 8, 12, 9, 50, 11, 4 };

    System.out.println(Arrays.toString(myArray));
    System.out.println(Arrays.toString(getThreeLowest(myArray)));
}

private static int[] getThreeLowest(int[] array) {
    int[] lowestValues = new int[3];
    Arrays.fill(lowestValues, Integer.MAX_VALUE);

    for(int n : array) {
        if(n < lowestValues[2]) {
            lowestValues[2] = n;
            Arrays.sort(lowestValues);
        }
    }
    return lowestValues;
}

这将输出:
[5, 8, 12, 9, 50, 11, 4]
[4, 5, 8]
调用Arrays.sort只对本地数组进行操作,不会影响主数组。这么做是为了简化与n的比较。

我需要知道最低的三个索引。 - M9A
你可以按照他输入的内容做,但不要将值存储在lowestValues数组中,而是存储索引(需要使用循环而不是foreach),然后在排序调用中添加一个比较器,以比较lowestValues中存储的索引位置的值。 - billjamesdev

3

基于您现有的构建

    int[] grades = { 100, 99, 98, 97, 10, 95, 11, 9, 94 };
    int numberOfStudents = grades.length;

    int minimum = grades[1];
    int minimum2 = grades[1];
    int minimum3 = grades[1];
    int index = 1;
    int index2 = 1;
    int index3 = 1;

    for(int i=1; i< numberOfStudents; i++){
        if (grades[i]<minimum3 && grades[i]>=minimum2){
            minimum3 = grades[i];
            index3 = i;
        }
        if (grades[i]<minimum2 && grades[i]>=minimum){
            //We have a new 2nd lowest - shift previous 2nd lowest up
            minimum3 = minimum2;
            index3 = index2;
            minimum2 = grades[i];
            index2 = i;
        }
        if (grades[i]<minimum){
            //We have a new lowest - shift previous lowest up
            minimum3 = minimum2;
            index3 = index2;
            minimum2 = minimum;
            index2 = index;
            minimum = grades[i];
            index = i;
        }
    }
    System.out.println("Smallest is at " + index + " with value of " + minimum);
    System.out.println("Next Smallest is at " + index2 + " with value of " + minimum2);
    System.out.println("Next Smallest is at " + index3 + " with value of " + minimum3);

1

这可能有点“过度”,但我能想到的是,你可以创建一个对象数组,每个对象包含原始“grades”数组中的值和索引,并对其进行排序?

我能想到的唯一另一种方法是遍历数组并手动跟踪3个最低元素及其索引,就像你已经在做的那样...


0

我们能做到吗?

    int[] myArray = { 5, 8, 12, 9, 50, 11, 4 };
    Arrays.sort(myArray);
    System.out.println(myArray[0] +","+ myArray[1] +","+ myArray[2]);

2
你在询问还是回答? - Smern

0
取三个变量:最小值、第二小的和第三小的。 与查找最小元素的方式相同,每一步都要找出哪些是最小的三个元素。
您需要检查任何元素是否小于最小数,或者它在最小数和第二小数之间,或者它在第二小数和第三小数之间。
由于这可能是一个作业、任务或家庭作业,我不会在这里编写代码。

谢谢,这不是作业。我只是在帮助朋友。 - M9A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接