4

我是一个初学者,这是我的第一个问题。我已经在网上搜索了答案,但我做不到。你们任何人可以提供的任何帮助都会让我的脸上露出笑容!

我正在编写一个同时循环两个数组的程序。这些是从用户定义的字符串转换而来的字符数组,因此它们的长度可能不同。以下是我的代码中当前的设置方式。

for(int i = 0; i < charArray1.length; i++)
    {   
        char keyChar = charArray1[i];
        char messageChar = charArray2[i];
    }

考虑上面的例子。可以这么说:

charArray1 = {'A','B','C','D'} 和
charArray2 = {'1','2','3','4','5','6','7}

目前,这种情况应该让我抛出一个越界异常。我希望看到发生的是一个循环返回到 charArray1 的开头,而另一个循环继续到 charArray2 的结尾。

如果我要打印它,它可能如下所示。

A1、B2、C3、D4、A5、B6、C7

任何帮助将不胜感激。我已经有一段时间了。

4

5 回答 5

6

您希望从循环中获得的迭代次数是最长数组的长度。你可以用Math.max(charArray1.length, charArray2.length);

然后你想在 index 处获取数组项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>=0b>0a%b

0 <= a%b < b

这是长度数组的可接受索引范围b

于 2014-12-23T16:19:22.220 回答
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
}

无论哪个数组更长,这都会起作用,并且它不依赖于%.

于 2014-12-23T16:44:51.680 回答
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就会再次循环,直到到达终点,此时外部 for 循环将终止,从而退出循环。还有其他方法可以做到这一点,但这是一种让像您这样的初学者更容易理解的方法。

然后,如果您希望它打印出 A1,B2,... 完全没有两个 for 循环,您可以执行以下操作。如果您正在处理大量数字,则两个 for 循环不是最好的方法,因为两个 for 循环是n^2whileif语句就像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];
}
于 2014-12-23T16:14:44.397 回答
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];
}

这是一个测试运行

这假设charArray2将始终是最长的数组。如果您认为这不是真的,请在进入循环之前进行检查

你也可以用%操作符做一些花哨的事情,但我更喜欢这种方法,因为它对新手来说更具可读性。

于 2014-12-23T16:18:03.283 回答
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];
}

这将独立于哪个数组更大。

于 2014-12-23T16:18:18.743 回答