我如何将此 for 循环转换为正确的 while 循环?

时间:2021-01-05 09:33:29

标签: java for-loop while-loop

我在下面输入的这段代码是原始的 for 循环

  String[][] wordData = {{"study", "consider", "examine", "learn"}, {"ponder", "read", "think", "cogigate"}};

int characterCount = 0;
for(String[] stringRow : wordData) {
    for(String s : stringRow) {
        characterCount += s.length();
    }
}
System.out.println(characterCount);

这是我对 while 循环的尝试

int i = 0, j = 0;
while(i<wordData.length) {
    j=0;
    while(j<wordData[i].length) {
        characterCount += wordData[j].length;
        System.out.print(characterCount);
        j++;
    }
    i++;
}

3 个答案:

答案 0 :(得分:1)

String[][] wordData = { {"study", "consider", "examine", "learn"}, {"ponder", "read", "think", "cogigate"}};
int characterCount = 0;
int i = 0;
while(i<wordData.length){
    int j = 0;
    while(j<wordData[i].length){
       characterCount += wordData[i][j].length();
       j++;
    }
    i++;
}

System.out.println(characterCount);

答案 1 :(得分:1)

您必须在每一步计算 var programs = _context.Program.Where(p => p.Activities.Any(a => a.Id == Id)).ToList(); 的长度。实际上,word[j] 是一个数组。

word[i][j]

使用 word[0] // {"study", "consider", "examine", "learn"} word[1] // {"ponder", "read", "think", "cogigate"} 实现此代码的正确方法是这样。

while

只是一个小东西,你必须在最后打印结果,而不是在循环中。

答案 2 :(得分:0)

for 转换为 while

只要了解 for 循环的工作原理,您就可以将任何 while 循环转换为 for 循环。这是一个简单的例子:

for (A; B; C) {
    D;
}

相当于

A;
while (B) {
    D;
    C;
}

但是,在您的特定情况下,您使用的不是传统的 for 循环,而是增强的 for 循环。其中,对于集合(任何Iterable)相当于使用Iterator

// elements being a collection like List<E>
for (E element : elements) {
    ...
}

相同
Iterator<E> elementIter = elements.iterator();
while (elementIter.hasNext()) {
    E element = elementIter.next();
    ...
}

但是,在您的特定情况下,您在数组上使用了增强的 for 循环。转换为传统的基于索引的 for 循环。所以

// elements being an array like E[]
for (E element : elements) {
    ...
}

相当于

for (int i = 0; i < elements.length; i++) {
    E element = elements[i];
    ...
}

我们可以轻松地将其转换为 while 循环,如前所示:

int i = 0;
while (i < elements.length) {
    E element = elements[i];
    ...
    i++;
}

您的代码

话虽如此,现在让我们来看看您的代码。在我们开始更详细地考虑您的代码之前,让我们盲目地应用上述转换:

第一步,将增强的 for 循环转换为传统的 for 循环:

String[][] wordData = {
    {"study", "consider", "examine", "learn"},
    {"ponder", "read", "think", "cogigate"}
};

int characterCount = 0;
for (int i = 0; i < wordData.length; i++) {
    String[] stringRow = wordData[i];
    for (int j = 0; j < stringRow.length; i++) {
        String s = stringRow[j];
        characterCount += s.length();
    }
}
System.out.println(characterCount);

现在 while 循环:

String[][] wordData = {
    {"study", "consider", "examine", "learn"},
    {"ponder", "read", "think", "cogigate"}
};

int characterCount = 0;
int i = 0;
while (i < wordData.length) {
    String[] stringRow = wordData[i];
    int j = 0;
    while (j < stringRow.length) {
        String s = stringRow[j];
        characterCount += s.length();
        j++;
    }
    i++;
}
System.out.println(characterCount);

如您所见,这相当容易。


在此期间,让我也向您展示一种如何使用流来解决您的任务的方法,因为它非常简短和优雅:

int characterCount = Stream.of(wordData) // Stream<String[]>
    .flatMap(Stream::of)                 // Stream<String>
    .mapToInt(String::length)            // IntStream
    .sum();

Unicode

关于 Unicode 陷阱的最后说明。您正在使用 characterCount 测量 String::length。这可能适用于您感兴趣的所有情况。但是,对于 Unicode 表中更高的符号,它会输出不正确的值。

例如字符串:

??

的长度为 4。我不是在开玩笑,"??".length() 返回 4 而不是 2

这是因为像 ?? 这样的符号实际上需要 2 个 char 来表示。 Unicode 是可变字节长度编码,因此并非所有符号都适合 Java 16 使用的 char 位。因此,如果您希望您的代码也适用于此类符号,您必须使用代码点,而不是简单的字符串长度

幸运的是,在 Java 中执行此操作仍然相当简单。以下是也适用于此类输入的流版本:

int characterCount = Stream.of(wordData)
    .flatMap(Stream::of)
    .mapToInt(s -> s.codePointCount(0, s.length())
    .sum();