循环不同长度的并行阵列

dmi*_*ada 2 java loops parallel-arrays

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

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

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

考虑上面的例子.让我们说:

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

目前,这种情况会让我失去一个超出范围的例外.我希望看到的是循环返回charArray1的开头,而另一个循环继续到charArray2的结尾.

如果我要打印它,它可能看起来像下面.

A1,B2,C3,D4,A5,B6,C7

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

khe*_*ood 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];
}
Run Code Online (Sandbox Code Playgroud)

编辑:

该模运算符(a%b)允许您将后剩下的金额a通过b.

例如,用b=3:

a   a%3
0    0
1    1
2    2
3    0
4    1
5    2
...
Run Code Online (Sandbox Code Playgroud)

你可以看到,如果ab与整数a>=0b>0,然后a%b将永远范围:

0 <= a%b < b
Run Code Online (Sandbox Code Playgroud)

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


jgr*_*208 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];
    }
Run Code Online (Sandbox Code Playgroud)

这个循环遍历内部循环,一旦到达结束,就会再次循环,直到到达结束,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];
}
Run Code Online (Sandbox Code Playgroud)