在数组中获取多个最小值(当我只想要一个时)

时间:2018-02-10 17:33:22

标签: java

我试图找到数组中的最小值和最大值。用于查找最大值的for循环正常工作(它打印100),但是,获取最小值的for循环打印多个数字(95,87,85,78)。我已经尝试更改System.out的放置位置以及使用带有int返回值的Method并继续显示多个值。

感谢任何帮助。

public static void main(String[] args) {
int[] scores = {99, 95, 87, 100, 94, 85, 78, 84, 97, 91};
int min = scores[0];
int max = scores[0];

for (int i = 1; i < scores.length; i++) {
    if (scores[i] < min)
    {
        min = scores[i];
        System.out.println(+ min);
    }
}

for (int i = 1; i < scores.length; i++) {
    if (scores[i] > max)
    {
        max = scores[i];
        System.out.println(+ max);
    }
}

5 个答案:

答案 0 :(得分:1)

这似乎是正确的。

由于您已经以非常高的价值开始,因此在整个阵列中只有一个值高于 it 。因此,您只能看到代码一次输入def import_midifiles(): BASE_URL = 'http://www.tadpoletunes.com/tunes/celtic1/' r = requests.get(BASE_URL) soup = BeautifulSoup(r.text, 'lxml') midi_list = [] reels_tr = soup.find('a', {'name': 'reels'}).find_parent('tr') for tr in reels_tr.find_next_siblings('tr'): if tr.find('a').text == 'SLIDES': break midi_list.append(BASE_URL + tr.find('a')['href']) return midi_list print(import_midifiles()) 块并且只打印一次。

因为您已经以非常高的值开始,所以几个值低于整个数组中的 it 。因此,您可以看到print语句的次数与较低的数字相同 - 在本例中为4。

如果有多个值超过100,您会看到更多值从if查找循环中打印出来。

如果您不想在完成之前看到这些值,那么就不要在循环中打印任何内容;打印各自循环的值。

答案 1 :(得分:1)

正确的代码如下所示:

for (int i = 1; i < scores.length; i++) {
    if (scores[i] < min)
    {
        min = scores[i];
        System.out.println(+ min);
    }
}

for (int i = 1; i < scores.length; i++) {
    if (scores[i] > max)
    {
        max = scores[i];
    }
}

System.out.println(min);
System.out.println(max);

如您所见,我将print语句移到了for循环之外。因为如果它们在循环内部会被执行多次,这就是代码中发生的事情。为什么max只能打印一次呢?这只是一个巧合。由于输入数组中只有一个数字大于第一个元素99,因此if语句只运行一次。

此外,您的两个循环可以合并:

for (int i = 1; i < scores.length; i++) {
    if (scores[i] < min)
    {
        min = scores[i];
    }
    if (scores[i] > max)
    {
        max = scores[i];
    }
}

System.out.println(min);
System.out.println(max);

答案 2 :(得分:0)

由于您在for循环中包含了标准输出语句,因此它将打印所有新的最小/最大值。您需要等到比较数组中的所有值并在for循环后打印最终的最小值/最大值。

做这样的事情。

public static void main(String[] args) {
int[] scores = {99, 95, 87, 100, 94, 85, 78, 84, 97, 91};
int min = scores[0];
int max = scores[0];

for (int i = 1; i < scores.length; i++) {
    if (scores[i] < min)
    {
        min = scores[i];
    }
}
 System.out.println(min);
for (int i = 1; i < scores.length; i++) {
    if (scores[i] > max)
    {
        max = scores[i];

    }
}
   System.out.println(max);

答案 3 :(得分:0)

以防这是一个真正的项目而不是家庭作业,我建议将最小和最大代码分解为单独的方法,并使用新的Java 8 Streams方法让JDK完成逻辑实现的工作

public static void main(String[] args) {
    int[] scores = {99, 95, 87, 100, 94, 85, 78, 84, 97, 91};
    System.out.println("Min is: "+minIntValueFromArray(scores));
    System.out.println("Max is: "+maxIntValueFromArray(scores));
}

public static int minIntValueFromArray(int[] array) {
    if (array.length == 0) {
        throw new IllegalArgumentException("Array must not be empty.");
    }
    return Arrays.stream(array).min().getAsInt();
}

public static int maxIntValueFromArray(int[] array) {
    if (array.length == 0) {
        throw new IllegalArgumentException("Array must not be empty.");
    }
    return Arrays.stream(array).max().getAsInt();
}

Arrays.stream(int[])方法(Java 8的一部分)使用它在原始IntStream数组中找到的数字创建int。 (建议您在使用Stream<Integer>时不要创建IntStream。){8} Streams API提供min()max()方法,所以你不必担心为这些函数编写代码。

请注意,max()min()会返回OptionalInt,因为有时可能会遇到空数组,因此流必须返回一个可选类型。这里调用getAsInt()是安全的,因为我们已经检查过以确保数组不为空。如果数组为空,则抛出异常,但是您选择如何处理空数组的情况取决于您。如果你想在一个空数组的情况下返回一个特定的int值,那么你可以用这样的方法替换该方法:

private static final int ARRAY_MIN_EMPTY_DEFAULT = 0;

public static int minIntValueFromArray(int[] array) {
    return Arrays.stream(array).min().orElse(ARRAY_MIN_EMPTY_DEFAULT);
}

请注意,很多人仍然对Java 8 Streams持谨慎态度,因为基准测试声称其性能低于使用旧的迭代方法(例如现有代码)。除非您的代码将用于应用程序的性能关键部分,否则您应该没问题。 (如果性能至关重要,您应该进行分析和基准测试,以确定需要优化的内容。)

答案 4 :(得分:-1)

只需在for循环外打印最小值和最大值。