【问题标题】:Can anyone please explain how this is working?谁能解释一下这是如何工作的?
【发布时间】:2020-02-24 04:14:36
【问题描述】:
int[] a = {1, 2, 3,4,1};
for (int n: a) {
    a[n] = 0;
}
for (int n: a) {
    System.out.print(n);
}

当我将所有数组元素设为 0 时,每个循环都会显示一些意想不到的结果。而不是显示所有的“0”,而是给出类似“00301”的输出。无法理解这是如何工作的?

【问题讨论】:

  • 我正在尝试使用 java,但在我认为的任何语言中,每个循环的工作都是相同的
  • 它不是 C#,也不是 C++。可能是Java?你知道你在用什么语言工作吗?不管它是什么,我很确定它不会像你想象的那样做。请注意,您正在迭代一个数组并将数组元素的值用作数组的索引。使初始值之一变大(例如,10)并观察会发生什么
  • a[n] = 0; 行的代码不正确。它不会使索引元素为零,但会使当前值索引处的元素为零。如果a[n] = 0; 不存在,n 的值将在迭代内部为1, 2, 3, 4 , 1。尝试基于索引的循环将数组项设置为零for(int i=0; i<a.length;i++) {a[i]=0;}

标签: java arrays foreach


【解决方案1】:

a[n] = 0;a[some_value_from_the_array] 设置为 0,而不是将所有数组元素设置为 0。

【讨论】:

    【解决方案2】:

    正如 Oracle 文档所述,java for-each 循环隐藏了迭代器,并且只允许您访问可迭代(数组)中的值。因此,for-each 循环不应该用于对原始数组进行主运算,而应该用于处理数组的数据。 https://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html 如果要操作原始数组,最好的办法是使用常规的 for 循环。

    【讨论】:

      【解决方案3】:

      这是对int[] 内容的两个for-each 循环。

      循环 1:对于 1, 2, 3, 4, 1 中的每个 n,将索引 1、0、3、0 和 1 的数组内容设置为零。您可以通过将其更改为来查看

      for (int n: a) {
          System.out.println(n);
          a[n] = 0;
      }
      

      a 的内容保留为0, 0, 3, 0, 1 然后

      循环 2:为 0, 0, 3, 0, 1 中的每个 n 打印 n

      因此您的程序会打印 00301。

      【讨论】:

        【解决方案4】:

        在:

        for (int n: a) 
        

        n 是数组中特定索引的不是索引本身。因此,您基本上是在索引 1、2、3、4、1 处设置 0。幸运的是,没有大于 4(数组长度)或负数的值,否则您将得到 ArrayIndexOutOfBoundException。

        for (int i=0; i<a.length;i++){
          a[i] = 0;
        } 
        

        使用上面的代码,你会得到预期的输出。

        【讨论】:

          【解决方案5】:

          如果你打印出它的作用,你会自己看到:

          int[] a = {1, 2, 3,4,1};
          System.out.println(Arrays.toString(a));
          for (int n: a) {
              System.out.print("a[" + n + "] = 0;  ->  ");
              a[n] = 0;
              System.out.println(Arrays.toString(a));
          }
          

          输出

          [1, 2, 3, 4, 1]
          a[1] = 0;  ->  [1, 0, 3, 4, 1]
          a[0] = 0;  ->  [0, 0, 3, 4, 1]
          a[3] = 0;  ->  [0, 0, 3, 0, 1]
          a[0] = 0;  ->  [0, 0, 3, 0, 1]
          a[1] = 0;  ->  [0, 0, 3, 0, 1]
          

          【讨论】:

          • @DevendraJadhav 我不是想给你答案,我只是想告诉你如何自己得到答案,这样你就不必再问了下次。 --- 给一个人一条鱼,你就喂他一天。教一个人钓鱼,你养他一辈子
          • 非常感谢先生为我提供了一种作为初学者获得答案的方法,这对我来说是必要的事情
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-04
          • 1970-01-01
          • 2012-03-04
          • 2018-12-24
          相关资源
          最近更新 更多