【问题标题】:How can I reduce this code to use only one while loop?如何减少此代码以仅使用一个 while 循环?
【发布时间】:2014-11-27 21:46:23
【问题描述】:

到目前为止,这是我的代码:

public class EvenOdd
{
   public static void main(String[]args)
   {
      System.out.print("Even numbers between 50 and 100: ");
      int e = 50;
      while (e <= 100) {
         System.out.print(" " + e);
         e += 2;
      }

      System.out.print("\nOdd numbers between 50 and 100: ");
      int i = 51;
      while (i <= 100) {
         System.out.print(" " + i);
         i += 2;
      }
   }
}

如何将这两个 while 循环减少到只有一个 while 循环?

【问题讨论】:

  • 这取决于您是否希望程序以相同的方式运行
  • 如果不将偶数和奇数交错,就无法做到这一点。
  • 有什么关系?在这两种情况下,你的程序都会执行 100 println,比较和加法。
  • @NuriTasdemir,有关系吗?问题的目的不应该讨论(对不起,我不是要取代任何适度,我只是觉得说得对)

标签: java loops while-loop


【解决方案1】:

将数字存储在两个StringBuilders 中,一个用于奇数,另一个用于偶数:

public class EvenOdd
{
   public static void main(String[]args)
   {
      StringBuilder even = new StringBuilder();
      StringBuilder odd = new StringBuilder();

      int e = 50;
      while (e <= 100) {
         if (e%2 == 0)
             even.append (" " + e);
         else
             odd.append (" " + e);
         e++;
      }
      System.out.print("Even numbers between 50 and 100: " + even.toString());
      System.out.print("\nOdd numbers between 50 and 100: " + odd.toString());
   }
}

【讨论】:

    【解决方案2】:
    public static void main(String[]args)
           {
              StringBuilder evenString = new StringBuilder("Even numbers between 50 and 100: ");
              StringBuilder oddString = new StringBuilder("Odd numbers between 50 and 100: ");
              int e = 50;
              while (e <= 100) {
                 if((e % 2) == 0)
                 {
                     evenString.append(" " + e);
                 }
                 else
                 {
                     oddString.append(" " + e);
                 }
                 e++;
              }
              System.out.println(evenString);
              System.out.println(oddString);
           }
    

    使用两个 StringBuilders 来存储要显示的字符串,然后在完成循环后将它们写出来。每个循环都进行模除 (%) 以查看其是偶数还是奇数。如果余数为 0,则即使不是,则为奇数。根据哪一个,它只是将其附加到适当的 StringBuilder。

    【讨论】:

      【解决方案3】:

      减少代码重复通常是一件好事。 Java 提供的最基本的工具是方法,因此您可以在方法中提取循环的行为并编写等效的程序:

      public class EvenOdd
      {
          public static void main(String[]args)
          {
              System.out.print("Even numbers between 50 and 100: ");
              printEverySecondNumber(50, 100);
      
              System.out.print("\nOdd numbers between 50 and 100: ");
              printEverySecondNumber(51, 100);
          }
      
          public static void printEverySecondNumber(int start, int end){
              int current = start;
              while (current <= end) {
                  System.out.print(" " + current);
                  current += 2;
              }
          }
      }
      

      请注意,此程序的行为完全相同:循环仍将执行两次,但不会在代码中重复。

      【讨论】:

      • 这仍然有 2 个循环。如果您想消除额外的 50 次迭代,请尝试执行以下解决方案之一。
      • 只有一个循环,但循环执行了两次。显然,性能不会有任何好处(或者性能甚至可能会降低,因为有一个额外的方法分派)。但是,在保持原始行为的同时减少了代码重复。不过,我也赞成使用字符串生成器的解决方案,因为它将字符串的创建与输出分开。
      【解决方案4】:

      使用列表。它们打印得很好。

      public class EvenOdd
      {
         public static void main(String[]args)
         {
           List<String> even = new ArrayList<String>();
            List<String> odd = new ArrayList<String>();
      
            int e = 50;
            while (e <= 100) {
               if (e%2 == 0)
                   even.add(String.valueOf(e));
               else
                   odd.add(String.valueOf(e));
               e++;
            }
            System.out.print("Even numbers between 50 and 100: " + even);
            System.out.print("\nOdd numbers between 50 and 100: " + odd);
         }
      }
      

      【讨论】:

        【解决方案5】:

        这是一个不存储数字的解决方案

        public static void main(String[] args) {
            int i = 0; 
            System.out.print("Even numbers between 50 and 100: ");
            while (i <= 50) {
                if (i == 26) { 
                    System.out.print("\nOdd numbers between 50 and 100: ");
                }
                if (i <= 25) {
                    System.out.print (" " + (2 * i + 50));
                } else {
                    System.out.print (" " + (2 * (i - 25) + 49));
                }
                i++;
            }
        }
        

        【讨论】:

          【解决方案6】:

          如果你决心做一个循环

          int n = 50;
          System.out.print("Even numbers between 50 and 100:");
          while(n < 151){
              if(n <= 100)
                  System.out.print(" " + n);
              else
                  System.out.print(" " + (n-50));
          
              if(n != 100)
                  n = n + 2;
              else{
                  System.out.print("\nOdd numbers between 50 and 100:");
                  n = n + 1;
              }
          }
          

          这样做的好处是您不会构建任何不必要的对象,也不必真正管理 n 以外的任何东西。

          如果您的目标是减少循环迭代

          StringBuilder evenString = new StringBuilder();
          StringBuilder oddString = new StringBuilder();
          
          int n = 50;
          while(n <= 100){
              evenString.append(" " + n);
              if(n != 100)
                  oddString = oddString.append(" " + (n + 1));
              n = n + 2;
          }
          
          System.out.println("Even numbers between 50 and 100:" + evenString);
          System.out.print("Odd numbers between 50 and 100:" + oddString);
          

          注意事项,this cuts your iterations in half over using a single while with if statements

          【讨论】:

            【解决方案7】:

            只需通过重新设置计数器来重新开始迭代:

            public class EvenOdd
            {
               public static void main(String[]args)
               {
                  int e = 0;
                  while (1) {
                     if (e==0) {
                         System.out.print("Even numbers between 50 and 100:");
                         e = 50;
                     }
                     else
                     if (e==102) { 
                         System.out.print("\nOdd numbers between 50 and 100:");
                         e = 51;
                     }
                     else
                     if (e==101) { 
                         System.out.print("\n");
                         break;
                     }
            
                     System.out.print(" " + e);
                     e += 2;
                  }
               }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-04
              • 2019-05-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多