我是个乞丐,这是我的第一个问题。我已经在网上搜索了答案,而且我很短暂。任何你能提供的帮助都会让我脸上露出笑容!!
我正在编写一个同时循环两个数组的程序。这些是从用户定义的字符串转换的char数组,因此它们的长度可能不同。以下是我的代码中当前设置的方式。
for(int i = 0; i < charArray1.length; i++)
{
char keyChar = charArray1[i];
char messageChar = charArray2[i];
}
考虑上面的例子。让我们说:
charArray1 = {&#39; A&#39;,&#39; B&#39;,&#39; C&#39;,&#39; D&#39;}和
charArray2 = {&#39; 1&#39;,&#39; 2&#39;,&#39; 3&#39;,&#39; 4&#39;,&#39; 5&#39;,&# 39; 6&#39;,&#39; 7}
目前这种情况会让我失去一个超出范围的例外。我希望看到的是一个循环返回到charArray1的开头,而另一个循环继续到charArray2的结尾。
如果我打印它,它可能看起来像下面。
A1,B2,C3,D4,A5,B6,C7
非常感谢任何帮助。我现在已经有一段时间了。
答案 0 :(得分:5)
循环中所需的迭代次数是最长数组的长度。你可以使用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
的数组的可接受索引范围。
答案 1 :(得分:0)
你需要做的是在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
的结束,此时循环的外部将终止,从而退出循环。还有其他方法可以做到这一点,但这是一种让你这样的初学者更容易理解的方法。
然后,如果你想要打印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];
}
答案 2 :(得分:0)
有第二个变量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];
}
这是test run
这假设charArray2
始终是最长的数组。如果您认为这是不真实的,只需在进入循环之前进行检查
你也可以使用%
运算符做一些奇特的东西,但我更喜欢这种方法,因为它对新手来说更具可读性。
答案 3 :(得分:0)
你想循环到最长数组的末尾,所以你选择两个长度的最大值作为循环的退出条件。
然后,您可以通过使用索引的模数同时循环两个数组,这样就不会抛出索引超出范围的异常:当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];
}
这将独立于哪个数组将更大。
答案 4 :(得分:0)
没有规则说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
}
无论哪个数组更长,都可以使用,并且它不依赖%
。