循环访问不同长度的并行阵列



我是一个乞丐,这是我的第一个问题。我已经在网上搜索了答案,但我很快就要失败了。你们中的任何人可以提供的任何帮助都会让我的脸上露出笑容!!

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

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

任何帮助将不胜感激。我已经在这里工作了一段时间了。

您希望从循环中进行的迭代次数是最长数组的长度。你可以通过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
...

您可以看到,如果 ab 是带有 a>=0b>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^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];
}

相关内容

  • 没有找到相关文章

最新更新