使用高级for循环而不是for循环

时间:2018-03-31 14:03:54

标签: java for-loop foreach

我有点困惑,我需要一些澄清。不太确定我是否在正确的轨道上,因此这个帖子。

这是我想要解密为高级foreach循环的代码。

    int[] arrayA = {3, 35, 2, 1, 45, 92, 83, 114};
    int[] arrayB = {4, 83, 5, 9, 114, 3, 7, 1};
    int n = arrayA.length;
    int m = arrayB.length;
    int[] arrayC = new int[n + m];
    int k = 0;

    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            if(arrayB[j] == arrayA[i])
            {
                arrayC[k++] = arrayA[i];
            }
        }
    }
    for(int i=0; i<l;i++)
        System.out.print(arrayC[i] + " ");
    System.out.println();

到目前为止,这是我被困的地方:

    int[] a = {3, 8, 2, 4, 5, 1, 6};
    int[] b = {4, 7, 9, 8, 2};
    int[] c = new int[a.length + b.length];
    int k = 0;
    for(int i : a)
    {
        for(int j : b)
        {
            if(a[i] == b[j]) 
            {
                c[k++] = a[i];
            }
        }
        //System.out.println(c[i]);
    }
    for(int i=0; i<c.length;i++)
        System.out.print(c[i] + " ");
    System.out.println();
}

3 个答案:

答案 0 :(得分:3)

你快到了

for(int i : a)
{
    for(int j : b)
    {
        if(i == j) 
        {
            c[k++] = i;
        }
    }
}

for(int i : a)使用a访问数组i中的元素。 如果a{3, 8, 2, 4, 5, 1, 6},则i在每次迭代时都为3,8,2,..,您不应该使用它来索引原始数组。如果您这样做,您将收到错误的数字或ArrayIndexOutOfBoundsException

由于您要选择两个数组中存在的数字,因此数组c的长度可以是max(a.length, b.length)。所以,int[] c = new int[Math.max(a.length, b.length)];就足够了。

如果要在结尾处截断0,可以执行

c = Arrays.copyOf(c, k);

这将返回一个仅包含k的第一个c元素的新数组。

答案 1 :(得分:1)

我会使用ListretainAll。在Java 8+中,您可以将int[]转换为List<Integer>,例如

int[] arrayA = { 3, 35, 2, 1, 45, 92, 83, 114 };
int[] arrayB = { 4, 83, 5, 9, 114, 3, 7, 1 };
List<Integer> al = Arrays.stream(arrayA).boxed().collect(Collectors.toList());
al.retainAll(Arrays.stream(arrayB).boxed().collect(Collectors.toList()));
System.out.println(al.stream().map(String::valueOf).collect(Collectors.joining(" ")));

输出

3 1 83 114

或者,如果您实际上除了显示它们之外并不需要这些值,并且您想要使用for-each循环(并且效率较低),例如

int[] arrayA = { 3, 35, 2, 1, 45, 92, 83, 114 };
int[] arrayB = { 4, 83, 5, 9, 114, 3, 7, 1 };
for (int i : arrayA) {
    for (int j : arrayB) {
        if (i == j) {
            System.out.print(i + " ");
        }
    }
}
System.out.println();

答案 2 :(得分:0)

临时变量不是foreach循环中数组中的索引。因此,在第0次迭代中,i包含a的第0个元素,j包含b中的第0个元素。你的尝试应该是这样的:

int[] a = {3, 8, 2, 4, 5, 1, 6}; 
int[] b = {4, 7, 9, 8, 2}; 
int[] c = new int[a.length + b.length]; 
int k = 0; 
for(int i : a) { 
   for(int j : b) { 
       if(i == j) { 
           c[k++] = i; 
       } 
   } //System.out.println(c[i]);
}

请注意,您的c[]数组将包含a[]中维护的订单。