【问题标题】:Enhanced For loop Java增强的 For 循环 Java
【发布时间】:2018-04-25 15:05:50
【问题描述】:

我正在尝试为以下整数数组编写一个 for 循环。数组的大小是 10。我写了两个循环。第一个循环将增加值,第二个循环将打印结果,如元素 1 为 10,元素 2 为 20。但我一直得到 0。我给出了以前的代码,一切都很好。出于测试原因,我想实现增强的 for 循环。但是我遇到了两个问题,如何增加值以及如何定义数组长度。这是我的代码。

public static void main(String[] args) {

    int[] myIntArray = new int[10];

    for(Integer num: myIntArray){
        myIntArray[num]=num*10;
    }

    for(int num:myIntArray){
        System.out.println("Element " + num + ", value is " + myIntArray[num]);

    }
}

以前的代码

 int[] myIntArray =new int[10];

    for(int i =0; i<myIntArray.length;i++){
        myIntArray[i]=i*10;
    }
    for(int i=0;i<myIntArray.length;i++){
        System.out.println("Element " + i + ", value is " + myIntArray[i]);
    }

【问题讨论】:

  • num*10 num的初始值是多少?它是0,因此你所做的就是将一些东西与0相乘
  • 你没有问问题
  • num*10 始终为0,因为这是ints 的默认值。你没有在你的数组中放任何元素,所以每个元素都是0
  • 初始化时int的默认值为0。你将 0 乘以任何东西,它会返回 0
  • 仅仅因为它被称为“增强”并不意味着它对一切都更好。通过使用带有 interation-counter 变量的普通 for 循环显然可以更好地满足您的要求,所以只需使用它。

标签: java arrays foreach


【解决方案1】:

首先你必须用索引填充数组:

    Arrays.setAll(myIntArray, i -> i);

在那之后,在输出过程中你不应该尝试将值作为myIntArray[num],因为使用增强的for循环你已经有了一个值,但没有它的索引。 所以结果代码应该是这样的:

public static void main(String[] args) {
    int[] myIntArray = new int[10];

    Arrays.setAll(myIntArray, i -> i);

    for(Integer num: myIntArray){
        myIntArray[num]=num*10;
    }

    for(int num : myIntArray){
        System.out.println("Element " + num/10 + ", value is " + num);

    }
}

虽然我同意以前的评论者的观点,即增强循环不是使用数组索引的正确选择。

【讨论】:

    【解决方案2】:

    int[] myIntArray =new int[10]; 你正在实例化一个包含 10 个元素的数组,所有这些元素都是 0。

    这就是为什么在这里:

    for(Integer num: myIntArray){
        myIntArray[num]=num*10;
    }
    

    您正在做的更像是 0*10,即 0。要纠正它:

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

    并显示:

    for(int num:myIntArray) {
        System.out.println("Element " + num + ", value is " + num);
    }
    

    【讨论】:

    • 我提供了之前的代码,一切正常。现在我想在增强的 for 循环中编写它。但我没能成功
    【解决方案3】:

    它们都返回零,因为当您构造数组时,数组中每个 int 的默认值都是零。然后你乘以十。它仍将返回为零。您需要在使用 for 循环之前填充数组。

    编辑:

    看到您的编辑后,我建议不要为此使用增强的 for 循环。在正确的情况下使用增强的 for 循环是一个很好的工具。它不会自动比常规的 for 循环更好,并且决定使用哪个循环应该取决于情况。

    【讨论】:

      【解决方案4】:

      这是简单的数学运算。 0*10 = 0 ;)

      您的 int 数组未初始化,int 原语的默认值为 0。如果您想使用基于索引的值预设它,您需要使用索引对数组进行迭代或在循环中添加一个。

      int index=0;
      for(Integer num: myIntArray){
          myIntArray[index]=(++index)*10;
      
      }
      

      for(int index=0;index<myIntArray.length;i++){
          myIntArray[i]=(i+1)*10;
      }
      

      【讨论】:

      • 我不知道为什么我会在这里投反对票。为了笑话?这是一个可行的答案
      • 第一种情况:num 永远不会增加,第二种情况:num 永远不会设置或增加。可能是你被否决的原因
      • 没错!谢谢:) 解释是正确的,这是我的错。我仍然认为我不应该只字不提 5 票。无论如何;)
      • 以下编辑:两种情况下都没有设置第一个元素,两种情况都会抛出 ArrayOutOfBoundException
      【解决方案5】:

      如果被循环的对象是一个数组,For each 将隐藏索引变量。如果被循环的对象是可迭代的,那么 for each 循环的实现会隐藏迭代器。 因此,如果它是一个数组,并且循环内需要一个索引,那么最好使用带有数组索引的循环。

      所以 for each 是这样写的:

      for(Integer num: myIntArray){
        myIntArray[num]=num*10;
      }
      

      类似于下面,在你的情况下:

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

      并且不要使用数组中的值来索引每个,因为如果值恰好> =数组长度,它将引发索引越界异常。这里没有,因为数组中的值是 int 类型,它们都被初始化为 0,小于数组长度 10。

      for(int num:myIntArray){
          System.out.println("Element " + num + ", value is " + myIntArray[num]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-20
        • 2013-06-14
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 2016-03-23
        • 2012-12-04
        相关资源
        最近更新 更多