【问题标题】:Why is my loop skipping this conditional?为什么我的循环跳过这个条件?
【发布时间】:2010-04-22 18:08:45
【问题描述】:

是我每天的新手 Java 问题的时间:-D

我一定没有正确理解 while 循环中的条件。

我有这个:

while (true){

     if (){
       ...
     } else {
       ...
     }
     if (){
       ...
     } else {
       ...
     }
     if (SENTINEL){
       break;
     }
 }

第一个 if/else 语句正在工作,并且哨兵正在工作,但第二个 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;
        }
    }
}

【问题讨论】:

  • 您应该发布您的实际代码;很明显,这段代码被重新输入了。事实上,它看起来并没有错。应该评估第二个 if。
  • 我们将需要 if 语句中的代码和条件代码,因为没有它我们将无能为力。
  • 有些东西你没有在这里展示给我们。请张贴您的实际代码。这还不够。顺便说一句:你忘记了break 后面的分号。

标签: java


【解决方案1】:

您是否要找出一系列数字的最小值和最大值?如果是这样,您绝对应该使用Math.min()Math.max()。这样就更清楚了,您可以取消 if 语句。使用局部变量而不是字段在循环中执行此操作也很简单。

常见的成语是这样的:

minValue = Math.min(minValue, candidateValue);
maxValue = Math.max(maxValue, candidatevalue);

【讨论】:

  • 因为我认为你想要测试if (latestValue &lt;= lowNumber)if (latestValue &gt;= highNumber)。你想在循环之前设置lowNumber = highNumber = value;
  • 啊-当然...因为在那个循环中价值永远不会改变..谢谢!
【解决方案2】:

您看到的行为可能是因为您总是将最新值与初始值进行比较。初始值永远不会改变——所以如果你输入以下输入:

20、60、50

报告的最高值是 50。那是因为 50 是大于 20 的最新值。我认为您可能是指将最新值与最高值进行比较,不是吗?

【讨论】:

    【解决方案3】:

    循环中绝对可以有 2 个 if/else 块;但是,如果您的哨兵被击中,则循环将退出。

    发布整个区块会有所帮助。


    当您在循环中输入的任何新值大于原始值时,将会发生什么(在阅读发布的代码后),lowNumber 将被设置回原始值。例如,如果您的输入是: 7 6 5 8 您相应的低数值将是: 7 6 5 7 这是不正确的。您可以做的是完全烤“值”变量,将您的低和高设置为原始值,然后在 get* 方法中比较最新与低和高。

    【讨论】:

    • 它现在就在那里 :-D 对不起...我以为我没有把整个代码放在帮助。
    • 整个代码看起来与您首先发布的 sn-p 完全不同。所以是的,看到真实的东西肯定会有所帮助。
    • 哨兵不会太早被击中。正在发生的事情是第一个 if 语句被评估,而不是第二个。如果我交换语句(getHighNumber(); 和 getLowNumber(); 那么循环中的第一个会被评估,但不会第二个。
    【解决方案4】:

    您不应该在 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) + ".");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 2022-01-02
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      相关资源
      最近更新 更多