查找数组的最小和最大数量
Finding the min and max number of an array
当我 运行 这个程序时,它找到最大数但总是打印 0.0 作为最小值。
当我使用 Double.POSITIVE_INFINITY 和 Double.NEGATIVE_INFINITY 而不是将最小和最大设置为 x[0] 时,它工作正常。
使用 Math.min 和 Math.max 也会给我同样的错误,但也适用于 Double.POSITIVE_INFINITY 和 Double.NEGATIVE_INFINITY。我查看了其他几个类似的问题,但不允许我使用 Array.sort 或人们 post.
的任何其他建议
我只是想知道为什么将两个变量都设置为 x[0] 只能找到最大的数字,无论我首先声明该变量,第二个还是将其设置为相等(双最大,最小 = x[0] ).
public class MaxAndMin {
public static void main (String[] args) {
Scanner s= new Scanner(System.in);
System.out.println("How many numbers would you like to enter?");
int n= s.nextInt();
double[] x= new double[n];
double smallest= x[0]; //double smallest= Double.POSITIVE_INFINITY;
double largest= x[0]; //double largest= Double.NEGATIVE_INFINITY;
for (int i=0; i<x.length; i++) {
x[i]= kbd.nextDouble();
if (x[i] > largest) {
largest = x[i];
} else if (x[i] < smallest) {
smallest = x[i];
}
}
System.out.println("Smallest number: " + smallest + " Largest number: " + largest);
}
}
当您初始化 smallest
和 largest
时,您没有将任何值放入 x
,因此它的元素只是创建数组时使用的默认值,即零。
因此,如果 1 小于零,您只会找到较小的 smallest
值(如果 1 大于零,则只会找到较大的 largest
值)。
您应该使用 POSITIVE_INFINITY
和 NEGATIVE_INFINITY
来初始化值,因为所有值分别小于和大于它们。
或者,您可以在 i == 0
时在 for 循环中初始化 smallest = largest = x[0]
。但是,前一种方法更可取,因为它不需要在每次迭代时检查 i == 0
。
或者,您可以将第一个赋值移出循环:
x[0] = smallest = largest = kbd.nextDouble();
for (int i = 1; i<x.length; i++) {
x[i] = kbd.nextDouble();
...
这避免了重复检查 i == 0
,但您必须复制 kbd.nextDouble()
。我仍然会使用第一种方法。
当我 运行 这个程序时,它找到最大数但总是打印 0.0 作为最小值。
当我使用 Double.POSITIVE_INFINITY 和 Double.NEGATIVE_INFINITY 而不是将最小和最大设置为 x[0] 时,它工作正常。
使用 Math.min 和 Math.max 也会给我同样的错误,但也适用于 Double.POSITIVE_INFINITY 和 Double.NEGATIVE_INFINITY。我查看了其他几个类似的问题,但不允许我使用 Array.sort 或人们 post.
的任何其他建议我只是想知道为什么将两个变量都设置为 x[0] 只能找到最大的数字,无论我首先声明该变量,第二个还是将其设置为相等(双最大,最小 = x[0] ).
public class MaxAndMin {
public static void main (String[] args) {
Scanner s= new Scanner(System.in);
System.out.println("How many numbers would you like to enter?");
int n= s.nextInt();
double[] x= new double[n];
double smallest= x[0]; //double smallest= Double.POSITIVE_INFINITY;
double largest= x[0]; //double largest= Double.NEGATIVE_INFINITY;
for (int i=0; i<x.length; i++) {
x[i]= kbd.nextDouble();
if (x[i] > largest) {
largest = x[i];
} else if (x[i] < smallest) {
smallest = x[i];
}
}
System.out.println("Smallest number: " + smallest + " Largest number: " + largest);
}
}
当您初始化 smallest
和 largest
时,您没有将任何值放入 x
,因此它的元素只是创建数组时使用的默认值,即零。
因此,如果 1 小于零,您只会找到较小的 smallest
值(如果 1 大于零,则只会找到较大的 largest
值)。
您应该使用 POSITIVE_INFINITY
和 NEGATIVE_INFINITY
来初始化值,因为所有值分别小于和大于它们。
或者,您可以在 i == 0
时在 for 循环中初始化 smallest = largest = x[0]
。但是,前一种方法更可取,因为它不需要在每次迭代时检查 i == 0
。
或者,您可以将第一个赋值移出循环:
x[0] = smallest = largest = kbd.nextDouble();
for (int i = 1; i<x.length; i++) {
x[i] = kbd.nextDouble();
...
这避免了重复检查 i == 0
,但您必须复制 kbd.nextDouble()
。我仍然会使用第一种方法。