【问题标题】:Converting loops (Java Beginner question)转换循环(Java 初学者问题)
【发布时间】:2011-04-16 21:45:33
【问题描述】:

循环之间的转换总是这样工作吗?或者有些情况它没有?当我在考试中解决这样的问题时,最快的检查方法是什么?

For循环:

 for(xx;yy;zz)
    { 
       aa
    }

While 循环:

    xx
    while(yy)
    {
      aa
      zz
    }

一边做:

      xx
      do
      { 
        aa
        zz
      }
    while(yy)

【问题讨论】:

  • 你的意思是aa而不是while循环体内的yy

标签: java loops syntax


【解决方案1】:

你有几个错误。尤其是do-while 循环是不正确的,因为它总是执行至少一次迭代,而forwhile 循环则不是这样。

for(x(); y(); z())
{ 
   a();
}

x();
while(y())
{
  a();
  z();
}

x();
if(y())
{
  do
  { 
    a();
    z();
  } while(y())
}

【讨论】:

  • 你能给我看一个将 for-loop 转换为 do-while 的例子吗?你是对的,我在做的时候总是犯错误。非常感谢。
  • @Mohammad:这个答案中有一个 do-while-loop 的例子,它看起来相当于顶部的 for 循环。
  • 我不认为你对do while的理解是正确的。 do while 保证至少执行一次代码。
  • @Dilum Ranatunga:完全正确,但 OP 要求将给定的 for 循环转换为 do-whilefor 循环首先执行 x()(总是),然后检查 y() 条件,如果计算结果为 true,则运行 a(),然后运行 ​​z()。我的do-while 表达了完全相同的逻辑。将给定的do-while 转换为for 也会很有趣(forwhile 实际上非常相似)。
  • 我的错误——我明白你在说什么。
【解决方案2】:

您应该注意for loopwhile loopdo-while loop 之间的一些根本区别:

1) 当你知道你必须循环某个东西多少次时,最好使用 For 循环。例如,当循环一个数字数组时,您需要循环的次数与数组中的元素一样多。

for循环结构:

2) 当你不知道你需要循环多少次时,最好使用 While 循环。例如,当从文件中读取文本行时,程序会一直读取到文件末尾,而事先并不知道它将读取多少行。

while循环结构:

3) Do-while 循环(又名 do 循环)最适合在您不知道必须循环某事物多少次并且希望至少执行一次循环时使用。例如,如果一个程序不断地从用户那里获取输入并输出它,直到用户输入字母“q”,那么您将使用 do-while 循环,因为您至少需要接受用户的输入一次。

Do-while 循环结构:

来源:Loops in Java – Ultimate Guide

【讨论】:

    【解决方案3】:

    其他成员已经涵盖了执行语义。但我想添加变量范围语义。

    在 Java 中,您可以这样做:

    for (Iterator<String> i = localList.iterator(); i.hasNext(); ) {
      String element = i.next();
      if (...) {
        i.remove();
      }
    }
    
    for (Iterator<String> i = importList.iterator(); i.hasNext(); ) {
      String element = i.next();
      if (...) {
        i.remove();
      }
    }
    

    变量“i”被使用了两次。

    为了将其转换为具有正确范围的 while 循环,您需要使用额外的代码块:

    {
      Iterator<String> i = localList.iterator();
      while (i.hasNext()) {
        String element = i.next();
        if (...) {
          i.remove();
        }
      }
    }
    
    {
      Iterator<String> i = importList.iterator();
      while (i.hasNext()) {
        String element = i.next();
        if (...) {
          i.remove();
        }
      }
    }
    

    注意额外的{ ... } 如何允许您使用相同的变量名。

    虽然在 Java 中不那么重要,但在 C++ 等语言中,作用域具有重要的影响,而不仅仅是能够使用相同的变量名。对象销毁、IIA(实例化即获取)等都会受到附加块的影响。

    【讨论】:

      【解决方案4】:

      for 语句与while 语句或do-while 语句之间的唯一区别在于for 还指定了迭代器的初始化和递增。
      例如,让我们以 Iterator 为例,它在 Java 中可用于遍历向量或类似的东西(例如链表):

      //we already have a variable v whom type implements List interface;
      for (Iterator vectorIterator = v.iterator(); vectorIterator.hasNext(); ) {
          //I left blank after the last ";" because there should come
          // the increment statement, and I need to store the .next() return value.
      
          int current = vectorIterator.next();
      }
      

      这里是while 版本:

      Iterator vectorIterator = v.iterator();
      while (vectorIterator.hasNext()) {
          int current = vectorIterator.next();
      }
      

      do-whilewhile 版本非常相似。

      我确实给了你这个更复杂的例子来告诉你,你用while做的任何事情,无论多么复杂,你都可以用for做任何事情。

      编辑do-while 语句作为while 的替代存在,唯一的区别是循环条件在迭代时检查和。因此,您可以使用do-while 对上面的示例进行等效处理,如下所示:

      Iterator vectorIterator = v.iterator();
      if (vectorIterator.hasNext()) {
          do {
              int current = vectorIterator.next();
          } while (vectorIterator.hasNext());
      }
      

      但是这样做没有任何目的。您应该为自己的目的使用每个工具。

      【讨论】:

      • 还有一点是,do-while 会在执行任何类型的条件检查之前检查其代码一次。
      • 谢谢。你能给我看一个 Do-While 的例子吗,因为这是我经常犯错误的地方
      • 您发布的内容非常完美。你只需要记住它会在检查它是否应该继续之前检查它的代码一次。因此,虽然 'while(false){a()}' 永远不会运行 a(),但 'do{a()}while(false)' 将运行一次。
      • 是的,我明白了这部分。但是假设while循环代码不会被执行。如何将相同的代码转换为 do-loop?我知道我在这里遗漏了一些愚蠢的东西。
      • 您可以在 do 循环中添加一个 if 语句,其条件与循环本身相同。但那将是试图将锤子用作锯子。
      【解决方案5】:
      // This class demonstrates the transliteration
      // between while, for, and for-each loop syntax
      public class LoopTest {
      
          // This method definition showcases do-while-loop syntax 
          public void doWhileLoop(Person[] people) {
              int i=0;
              do {
                  Person p = people[i];
                  System.out.println(p.getName());
                  i++;
              }while(i<people.length);
          }
      
          // This method definition showcases while-loop syntax 
          public void whileLoop(Person[] people) {
              int i=0;
              while(i<people.length) {
                  Person p = people[i];            
                  System.out.println(p.getName());            
                  i++;
              }
          }
      
          // This method definition showcases for-loop syntax    
          public void forLoop(Person[] people) {
              for(int i=0; i<people.length; i++) {
                  Person p = people[i];            
                  System.out.println(p.getName());             
              }
          }
      
          // This method definition showcases for-each-loop syntax        
          public void forEachLoop(Person[] people) {
              for(Person p : people) {
                  System.out.println(p.getName()); 
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 2013-03-29
        • 2021-12-05
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        相关资源
        最近更新 更多