我在下面输入的这段代码是原始的 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++;
}
答案 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 陷阱的最后说明。您正在使用 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();