【问题标题】:Using advanced for loop instead of for loop使用高级 for 循环而不是 for 循环
【发布时间】:2018-03-31 14:03:54
【问题描述】:

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

这是我想破译成高级 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();
}

【问题讨论】:

  • ij 的值将在每次迭代时重置。并且为了使用array[index]形式,不能使用foreach循环中的临时变量进行直接索引

标签: java for-loop foreach


【解决方案1】:

你快到了

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)]; 就足够了。

如果你想在末尾截断0s,你可以这样做

c = Arrays.copyOf(c, k);

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

【讨论】:

  • 这看起来很合理。
  • 我用上面的方法运行了程序,令人惊讶的是它遍历了整个数组'c',结果是3个普通数字加上数组中其余的保留槽,请看这里:8 2 4 0 0 0 0 0 0 0 0 0
  • 是的,因为您预先创建了 c 数组。 (与增强的 for 循环无关)
  • 由于数组需要预定义的长度,你能做的最好的就是取ab长度的最大值。如果您需要大小可调的数组(还有很多其他选项),您可以阅读 ArrayList 的相关信息
  • 那里有邪恶的帮助,先生!非常感谢
【解决方案2】:

我会使用ListretainAll。在 Java 8+ 中,您可以将 int[] 转换为 List&lt;Integer&gt;,如下所示,

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();

【讨论】:

  • Elliott,您的评论确实让我感到惊讶,尽管我目前的知识水平不足以完全理解它。感谢您的努力:)
  • 出于好奇,您建议的第一个解决方案无法编译,它遇到错误: List is not generic, it cannot be parameterized with ,我错过了什么吗?跨度>
  • 需要 Java 8+,即java.util.List
【解决方案3】:

临时变量不是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[] 中维护的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 2011-10-06
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    相关资源
    最近更新 更多