我的每日新手Java问题的时间:-D
我不能正确理解while循环中的条件。
我有这个:
while (true){
if (){
...
} else {
...
}
if (){
...
} else {
...
}
if (SENTINEL){
break;
}
}
第一个if / else语句正在工作,并且sentinel正在工作,但第二个if语句被跳过。如果我翻转第一个和第二个if语句,那么第一个if语句仍然会被执行并跳过第二个。我错过了什么?
我可以在一个块中有两个if / else语句吗?
我将包含整个代码,虽然它非常难看,但我相信我会让很多人告诉我更好的方法。我不介意学习更好的方法,但就目前而言,我只想回答这个循环问题。谢谢!
public class FindRange extends ConsoleProgram {
private static final int SENTINEL = 0;
int value = 0;
int highNumber = 0;
int latestValue = 0;
int lowNumber = 0;
public void run() {
addNumbers();
}
private void addNumbers(){
value = readInt("Enter number:");
while(true){
if (value == SENTINEL){
break;
}
latestValue = readInt("Enter number:");
getHighNumber();
getLowNumber();
if (latestValue == SENTINEL){
break;
}
}
println("High Number is "+highNumber+".");
println("Low Number is "+lowNumber+".");
}
private void getHighNumber(){
if (latestValue >= value){
highNumber = latestValue;
}else {
highNumber = value;
}
}
private void getLowNumber(){
if (latestValue <= value){
lowNumber = latestValue;
}else {
lowNumber = value;
}
}
}
答案 0 :(得分:2)
您是否正在尝试查找一系列数字的最小值和最大值?如果是这样,您一定要使用Math.min()
和Math.max()
。这样更清楚,你可以取消if
语句。它也很简单,可以在循环中使用局部变量而不是字段。
常见的习语是这样的:
minValue = Math.min(minValue, candidateValue);
maxValue = Math.max(maxValue, candidatevalue);
答案 1 :(得分:1)
你肯定在循环中有2个if / else块;但是如果你的哨兵被击中,那么循环就会退出。
发布整个区块会有所帮助。
当您在循环中输入的任何新值大于原始值时,将会发生什么(在阅读发布的代码之后),lowNumber将重新设置为原始值。例如,如果您的输入是: 7 6 5 8 您对应的低数值将是: 7 6 5 7 这是不正确的。您可以做的是完全覆盖“value”变量,将low和high设置为原始值,然后在get *方法中将最新值与低值和高值进行比较。
答案 2 :(得分:1)
您所看到的行为可能来自于您始终将最新值与初始值进行比较的事实。初始值永远不会改变 - 所以如果您输入以下输入:
20,60,50
报告的高值将是50.这是因为50是最近的值大于20.我认为你可能意味着将最新值与高值进行比较,不是吗?
答案 3 :(得分:0)
你不应该在while循环的底部设置value = latestValue
吗?
在初始读取后,值永远不会更新......可能是这样的:
public class FindRange extends ConsoleProgram {
private static final int SENTINEL = 0;
public void run() {
addNumbers();
}
private void addNumbers() {
int value = 0;
// Set this to highest possible value
int highNumber = Integer.MIN_VALUE;
// Set this to lowest possible value
int lowNumber = Integer.MAX_VALUE;
while (true) {
value = readInt("Enter number:");
if (value == SENTINEL)
break;
lowNumber = Math.min(lowNumber, value);
highNumber = Math.max(highNumber, value);
}
println("High Number is " + Integer.toString(highNumber) + ".");
println("Low Number is " + Integer.toString(lowNumber) + ".");
}
}