Java中嵌套循环的类型

dom*_*oos 2 java for-loop

我有一个简单的问题.我必须在java中找到许多嵌套循环.我有类似for循环和if语句的内容.我知道我们也可以做类似的if{if{if{if{事情.只需要了解更多类型的嵌套循环.

如果你能写下一些例子.我会很高兴的.谢谢.

public class Test {
    public static void main (String []args) {
        int i = 0;

        for(int j = 1; j <= 5; j++) {
            if(j == 1 || j == 5) {
                i = 4;
            } else {
                i = 1;
            }
            for(int x = 0; x < i; x++) {
                System.out.print("**");
            }
            System.out.println();
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 6

您可以在Java中嵌套尽可能多的for/ while循环:没有实际限制.

Java有4个循环结构:

Java没有goto(无论如何都不需要).

也可以看看


例子

这是一个简单的"三角形"类型嵌套循环的典型示例,其中内循环的迭代次数取决于外循环中迭代的值:

for (int i = 1; i <= 5; i++) {     // prints:
   for (int j = 0; j < i; j++) {   // *
      System.out.print("*");       // **
   }                               // ***
   System.out.println();           // ****
}                                  // *****
Run Code Online (Sandbox Code Playgroud)

下面是一个"配对"类型嵌套循环的示例,其中两个循环使用for-each结构彼此独立:

int[] numbers = { 1, 2, 3 };                       // prints:  // if swapped:
char[] letters = { 'A', 'B', 'C' };                // 1 A      // 1 A
                                                   // 1 B      // 2 A
for (int number : numbers) {                       // 1 C      // 3 A
   for (char letter : letters) {                   // 2 A      // 1 B
       System.out.println(number + " " + letter);  // 2 B      // 2 B
   }                                               // 2 C      // 3 B
}                                                  // 3 A      // 1 C
                                                   // 3 B      // 2 C
                                                   // 3 C      // 3 C
Run Code Online (Sandbox Code Playgroud)

for-each缺少显式索引的构造使得两个循环的独立性显而易见:您可以for在上面的代码中交换两个语句,并且您仍然可以获得所有对,尽管以不同的顺序列出.

这种boolean方法用于while循环(这个来自java.util.Scanner)是典型的:

Scanner sc = new Scanner("here we go again");     // prints:
while (sc.hasNext()) {                            // hereeeee
   String s = sc.next();                          // weeeee
   char lastChar = s.charAt(s.length() - 1);      // gooooo
   for (int i = 0; i < 4; i++) {                  // againnnnn
      s += lastChar;
   }
   System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例,显示了与以下do-while内容的不同之处:while-dofor

    int x = 0;
    do {
        System.out.println("Hello!!!");
    } while (x != 0);
Run Code Online (Sandbox Code Playgroud)

上面的循环打印Hello!!!:在do-while检查终止条件之前执行a的主体.


一个更详细的例子

这是一个嵌套循环逻辑的示例,但重构为方法以使事物更具可读性.这对于初学者来说很重要:只是因为你可以根据需要在物理上嵌套循环,并不意味着你应该这样做.通过拆分这样的逻辑,程序变得更加模块化和可读,并且每个逻辑都独立存在,可以进行测试和重用等.

此片段会反转char[]原位单词的字母.

static void swap(char[] arr, int i, int j) {
    char t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
}
static void reverse(char[] arr, int from, int to) {
    int N = (to - from);
    for (int i = 0; i < N / 2; i++) {
        swap(arr, from+i, to-1-i);
    }
}
public static void main(String[] args) {
    char[] sentence = "reversing letters of words in sentence".toCharArray();
    final int L = sentence.length;
    int last = 0;
    for (int i = 0; i <= L; i++) {
        if ((i == L) || (sentence[i] == ' ')) {
            reverse(sentence, last, i);
            last = i + 1;
        }
    }
    System.out.println(new String(sentence));
    // prints "gnisrever srettel fo sdrow ni ecnetnes"
}
Run Code Online (Sandbox Code Playgroud)

这个例子也很有启发性,即使它本质上是一个嵌套循环算法,它实际上也是 O(N)!认为任何双重嵌套循环算法必须是错误的O(N^2)- 它实际上取决于算法本身而不仅仅是物理结构.


嵌套循环算法

这些是传统上使用嵌套循环实现的经典算法(至少以它们的天真形式):

这些都不是详尽的抽样,但它应该for为初学者提供各种嵌套循环算法的良好介绍.

  • @dominoos:我不能为你做团体书项目.对不起,我已尽我所能了. (2认同)