我正在尝试找到具有十个输入点的数组的最小值,但是我设法创建了一些只能找到最大值的数组。帮助
import java.util.Scanner;
public class Ex7_9Smallestt {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int count = 0;
System.out.print("Welcome to Elisabeth's smallest number finder!\n");
//print welcome message
double myList [] = new double[10]; //initialize array
while (count < 10) { //initialize for loop
//print enter a number and make that number an element in the array
int i = 0;
System.out.print("\nPlease enter a number:");
myList[i] = input.nextDouble();
count ++;
}
System.out.printf("The minimum is " + min(myList)); //print minimum
}
public static double min(double[] array) {
//create method to find lowest number
double minimum = array[0];
int i = 0;
//initialize for loop
for (double e : array) {
if (array[i] < minimum) {
minimum = array[i];
i++;
}
}
return minimum;
}
}
答案 0 :(得分:2)
for(double e: array){
if(array[i] < minimum){
minimum = array[i];
}
i++;
}
上面会有效,而你的下面则没有。
for(double e: array){
if(array[i] < minimum){
minimum = array[i];
i++;
}
}
原因很简单。在所有情况下都不会增加i
,因此它会被卡住并反复比较相同的元素。它没有返回最大值,大部分时间都是第一个元素。
你不需要i
,因为你使用了增强的for循环,这意味着正确的方法将是
for(double e: array) {
if(e < minimum) {
minimum = e;
}
}
或者如果您喜欢i
for (int i = 0; i < array.length; i++) {
if (array[i] < minimum) {
minimum = array[i];
}
}
将两种循环类型结合起来可以起作用,但感觉更像是偶然的。
答案 1 :(得分:1)
如果你使用像那样的for循环那么
render: function() {
return(
<div className={this.getClass()}>Example</div>
);
}
比通过索引混合访问更好。
for ( double candidate : array ) {
if ( candidate < minimum ) {
minimum = candidate;
}
}
你的例子失败了,因为如果第一个元素实际上小于它本身(即从不),你的唯一递增i ...通过在纸上处理它来检查循环的第一次迭代。
使用您的代码可以使用
@Test public void min() {
double[] array = new double[4];
array[0] = 5;
array[1] = 2;
array[2] = 3;
array[3] = 7;
double min = array[0];
for ( double candidate : array ) {
if ( candidate < min ) {
min = candidate;
}
}
assertEquals(2, min, 0.05);
}
但你可以看到,不通过索引混合访问更具可读性,并且更不容易出错。
答案 2 :(得分:0)
首先,您错误地填充了数组。目前你有
int i = 0;
System.out.print("\nPlease enter a number:");
myList[i] = input.nextDouble();
count ++;
在每次迭代时发生。因此,您每次都将i
设置为零并且每次都存储myList[i]
,因此您只需反复填充myList[0]
。相反,循环到count < myList.length
并使用myList[count]
在每个索引处分配值。
其次,您在最小查找程序方法中无缘无故地使用for-each循环。我会将其更改为正常的for循环,因为无论如何都使用i
索引到数组中。
答案 3 :(得分:0)
首先,简单地使用println()
方法而不是print
并使用\n
字符会更容易看起来更好。
另外,为什么不提示用户Enter 10 values:
并使用for loop
int i<10
?
在min()
中,您实际上是在增强型for loop
内创建了一个临时for loop
。这是不必要的。彻底摆脱int i
。
此外,您只是相对于下一个元素进行排序。您需要检查它是否是绝对最小值。
我会从使用array
切换到ArrayList<int>
。 注意:&lt;&gt;中的所有内容是一个类型参数化器;通常,您可以使用E
作为占位符,使其成为通用算法(该方法可以使用扩展Comparable
接口的任何数据类型)。这样,您可以使用迭代器,并使用更有效的算法:
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public static<Integer extends Comparable<Integer>> Integer findMin(Collection<Integer> c) {
Iterator<Integer> i=c.iterator();
Integer current=i.next();
Integer min=current;
Integer next;
while(i.hasNext()){
next=i.next();
if(min.compareTo(next)>0){
min=next;
}
}
return min;
}
修改抱歉,我误读了您的代码;只需在我的代码中用Integer
替换double
中的每个实例。