循环不同长度的并行阵列

时间:2014-12-23 16:12:32

标签: java loops parallel-arrays

我是个乞丐,这是我的第一个问题。我已经在网上搜索了答案,而且我很短暂。任何你能提供的帮助都会让我脸上露出笑容!!

我正在编写一个同时循环两个数组的程序。这些是从用户定义的字符串转换的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

非常感谢任何帮助。我现在已经有一段时间了。

5 个答案:

答案 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
...

您可以看到,如果aba>=0b>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^2if语句只是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
}

无论哪个数组更长,都可以使用,并且它不依赖%