我是一个乞丐,这是我的第一个问题。我已经在网上搜索了答案,但我很快就要失败了。你们中的任何人可以提供的任何帮助都会让我的脸上露出笑容!!
我正在编写一个同时循环两个数组的程序。这些是从用户定义的字符串转换的 char 数组,因此它们的长度可能不同。以下是当前在我的代码中的设置方式。
for(int i = 0; i < charArray1.length; i++)
{
char keyChar = charArray1[i];
char messageChar = charArray2[i];
}
考虑上面的例子。 让我们说:
charArray1 = {'A','B','C','D'} 和
charArray2 = {'1
目前,这种情况给我抛出了一个越界的例外,因为它应该。我希望看到的是,一个循环返回到charArray1的开头,而另一个循环继续到charArray2的末尾。
如果我打印这个,它可能看起来像下面这样。
A1, B2, C3, D4, A5, B6, C7
任何帮助将不胜感激。我已经在这里工作了一段时间了。
您希望从循环中进行的迭代次数是最长数组的长度。你可以通过Math.max(charArray1.length, charArray2.length);
然后你想在索引 i
处获取数组项,但在它经过数组长度时循环。你可以得到它 arr[i%arr.length]
.
组合:
int m = Math.max(charArray1.length, charArray2.length);
for (int i = 0; i < m; ++i) {
char keyChar = charArray1[i%charArray1.length];
char messageChar charArray2[i%charArray2.length];
}
编辑:
取模运算符(a%b
)给出a
除以b
后的剩余量。
例如,对于b=3
:
a a%3
0 0
1 1
2 2
3 0
4 1
5 2
...
您可以看到,如果 a
和 b
是带有 a>=0
和 b>0
的整数,则a%b
将始终在以下范围内:
0 <= a%b < b
这是长度b
数组的可接受索引范围。
j
第二个变量来跟踪较小数组的索引。
//charArray1 = {'A','B','C','D'}
//charArray2 = {'1','2','3','4','5','6','7}
int j = 0;
for(int i = 0; i < charArray2.length; i++)
{
char keyChar = charArray1[j];
j++;
if(j == charArray1.length)
j=0;
char messageChar = charArray2[i];
}
下面是一个测试运行
这假设charArray2
将始终是最长的数组。如果您认为这是不正确的,只需在进入循环之前进行检查
你也可以用%
运算符做一些花哨的事情,但我更喜欢这种方法,因为它对新手来说更具可读性。
您希望循环到最长数组的末尾,因此选择两个长度中的最大值作为循环的退出条件。
然后,你可以通过使用索引的模来同时循环两个数组,这样你就不会把索引抛出界外异常:当i
变得更刨丝时,数组的边界,使用模(%
)运算符,你从该数组的开头重新启动。
for (int i = 0; i < Math.max(charArray1.length,charArray2.length); i++) {
char keyChar = charArray1[i%charArray1.length];
char messageChar = charArray2[i%charArray2.length];
}
这将独立于哪个数组更大而工作。
没有规则说for
循环的索引必须是任何数组的索引。 下面是使用计数器和两个单独数组索引的方法:
int totalCount = Math.max(charArray1.length, charArray2.length);
int i = 0;
int j = 0;
for (int count = 0; count < totalCount; count++) {
char keyChar = charArray1[i++];
if (i >= charArray1.length) {
i = 0;
}
char messageChar = charArray2[j++];
if (j >= charArray2.length) {
j = 0;
}
// code that outputs the two characters, or whatever
}
无论哪个数组更长,这都将起作用,并且它不依赖于%
。
你需要做的是在 for 循环中创建一个 for 循环
for(int i = 0; i < charArray2.length; i++)
{
for(int j = 0; j < charArray1.length; j++)
char keyChar = charArray1[j];
char messageChar = charArray2[i];
}
这在内部循环上循环,一旦到达结束循环,就会再次循环,直到到达charArray2
的终点,此时外侧 for 循环将终止从而退出循环。还有其他方法可以做到这一点,但这是一种让像您这样的初学者更容易理解的方法。
然后,如果您希望它打印出A1,B2,...完全没有两个 for 循环,您可以执行以下操作。如果您正在处理大量数字,则两个 for 循环不是最好的方法,因为两个 for 循环是n^2
而 if
语句只是一个常量,就像我认为1
一样。
int max = Math.max(charArray1.length, charArray2.length);
int j = 0;
for (int i = 0; i < max; ++i) {
if(j==charArray1.length)
j = 0;
else
j++;
char keyChar = charArray1[j];
char messageChar charArray2[i];
}