【问题标题】:java for-each loop for partial array用于部分数组的java for-each循环
【发布时间】:2013-11-07 16:01:24
【问题描述】:

我知道如何使用 for-each 循环来循环遍历整个数组,如下所示:

for(int d : arrayname){
    do something

但是您如何使用 for-each 循环循环通过部分数组,就像我尝试做的那样是使用 for-each 循环仅通过 5 月至 10 月的几个月,即 [4] - [9] 计算热量指数。这是我的代码的 sn-p,它显示了我正在尝试做的事情:

// create array for KeyWestTemp
    double[] KeyWestTemp;
    KeyWestTemp = new double[12];

    // initialize array
    KeyWestTemp[0] = 70.3;
    KeyWestTemp[1] = 70.8;
    KeyWestTemp[2] = 73.8;
    KeyWestTemp[3] = 77.0;
    KeyWestTemp[4] = 80.7;
    KeyWestTemp[5] = 83.4;
    KeyWestTemp[6] = 84.5;
    KeyWestTemp[7] = 84.4;
    KeyWestTemp[8] = 83.4;
    KeyWestTemp[9] = 80.2;
    KeyWestTemp[10] = 76.3;
    KeyWestTemp[11] = 72.0;

    // create array for KeyWestHumid
    int[] KeyWestHumid;
    KeyWestHumid = new int[12];

    // initialize array
    KeyWestHumid[0] = 69;
    KeyWestHumid[1] = 67;
    KeyWestHumid[2] = 66;
    KeyWestHumid[3] = 64;
    KeyWestHumid[4] = 66;
    KeyWestHumid[5] = 69;
    KeyWestHumid[6] = 67;
    KeyWestHumid[7] = 67;
    KeyWestHumid[8] = 70;
    KeyWestHumid[9] = 69;
    KeyWestHumid[10] = 69;
    KeyWestHumid[11] = 70;

    // for-each loop for calculating heat index of May - October

[0] 是一月,[11] 是十二月

【问题讨论】:

  • 你使用 for 循环...

标签: java arrays foreach partial


【解决方案1】:
double[] mayOctober = Arrays.copyOfRange(KeyWestHumid, 4, 9);

foreach mayOctober 去做你要求的事情。

顺便说一句,在这种情况下,最好使用常规循环。

【讨论】:

  • 这感觉像是 hack,而传统的 for 循环可以直接实现这一点
  • 但 OP 要求一个 foreach,而不是一个commentional for 循环;)
  • 您在技术上是正确的,就问题的字母而言,您是对的。我希望这不是他们真正想要的,但这是他们要求的
  • 我可能(不承认任何事情)对这个答案投了反对票,如果你想编辑它(简单的编辑,只是为了解锁)我可能会删除它(如果它曾经存在的话)
【解决方案2】:

您正在使用增强的for循环,您可以使用常规的for循环来实现您想要的效果

for(int i=START; i<=END;i++){
     //do work
}

在你的情况下,它很可能看起来像

int sumOfHumidity=0
for(int month i=4; i<=9;i++){
     sumOfHumidity+=KeyWestHumid[month]
}

然后使用您认为合适的sumOfHumidity

其他说明

  • KeyWestHumid 是一个变量,因此它应该是 lowerCamelCase,所以 keyWestHumidkeyWestTemp 相同
  • 4 和 9 的硬编码可能是不可取的,但在不知道确切的程序结构的情况下,除了说使用变量 startMonthendMonth 可能是可取的之外,很难给出进一步的建议,允许计算 numberOfMonths使用这两个(我希望你会想要从 sumOfHumidity 创建一个平均值)

【讨论】:

    【解决方案3】:

    您可以使用普通的 for 循环:

    for(int month=4; month<=9; month++){
     KeyWestHumid[month].something();
    }
    

    【讨论】:

      【解决方案4】:

      您不能使用增强的 for 循环来部分迭代数组。
      根据Java语言规范:

      增强的 for 语句等价于基本的 for 语句 形式:

      T[] #a = Expression;
      L1: L2: ... Lm:
      for (int #i = 0; #i < #a.length; #i++) {
          VariableModifiersopt TargetType Identifier = #a[#i];
          Statement
      }
      

      您可以按照其他答案中的建议,创建一个仅包含您要迭代的元素的新数组(或任何其他集合)或使用常规 for 循环。

      【讨论】:

      • drorb - 我认为增强的 For 需要类实现迭代器。一个完整的数组如何能够使用增强型?
      • Expression的类型必须是Iterable或数组类型,否则会出现编译时错误。见docs.oracle.com/javase/specs/jls/se7/html/…
      • 啊……明白了。谢谢!
      【解决方案5】:

      在 Java 8 中:

      double[] array = {1, 6, 7, 3, 3, 1, 2, 8, 9, 7, 3};
      
      Arrays.stream(array, 3, 6).forEach((d) -> {
          System.out.println(d);
      });
      
      OR
      
      IntStream.range(3, 6).mapToDouble(i -> array[i]).forEach(d -> {
          System.out.println(d);
      });
      

      【讨论】:

        【解决方案6】:

        您可以尝试摆脱数组并使用Lists。

        public void test() {
          List<Double> keyWestTemp = new ArrayList(Arrays.asList(70.3, 70.8, 73.8, 77.0, 80.7, 83.4, 84.5, 84.4, 83.4, 80.2, 76.3, 72.0));
          System.out.println("Key West Temps: "+keyWestTemp);
          System.out.println("Apr-Jun Temps: "+keyWestTemp.subList(3, 6));
          keyWestTemp.set(4, 81.6);
          System.out.println("Apr-Jun Temps: "+keyWestTemp.subList(3, 6));
        }
        

        显然,您可以像打印子列表一样轻松地遍历子列表,并且它们会传递到底层列表。即,如果您更改原始列表,子列表也会看到更改。

        【讨论】:

          猜你喜欢
          • 2015-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-01
          • 1970-01-01
          • 2019-04-30
          • 1970-01-01
          • 2020-10-05
          相关资源
          最近更新 更多