转换循环(Java初学者问题)

时间:2011-04-16 21:45:33

标签: java loops syntax

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

For Loop:

 for(xx;yy;zz)
    { 
       aa
    }

While Loop:

    xx
    while(yy)
    {
      aa
      zz
    }

Do While:

      xx
      do
      { 
        aa
        zz
      }
    while(yy)

5 个答案:

答案 0 :(得分:5)

你有几个错误。特别是do-while循环不正确,因为它总是执行至少一次迭代,而forwhile循环不是这种情况。

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

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

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

答案 1 :(得分:1)

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

1)当您知道必须循环多少次时,最好使用For循环。例如,当循环遍历数字数组时,您需要循环遍历数组中的元素。

对于循环结构:

For loop structure

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

while循环结构:

While loop structure

3)Do-while循环(aka do循环)最好用于你不知道循环某些东西多少次并且你想要至少执行一次循环。例如,如果程序不断地从用户那里获取输入并输出它,直到用户输入字母“q”,那么你将使用do-while循环,因为你需要至少使用一次用户的输入。

Do-while循环结构:

Do-while loop structure

来源:Loops in Java – Ultimate Guide

答案 2 :(得分:0)

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

//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());
}

但这样做没有任何意义。您应该将每个工具用于自己的目的。

答案 3 :(得分:0)

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

在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 :(得分:0)

// 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()); 
        }
    }
}