如何将此for循环转换为每个

时间:2015-03-02 15:26:23

标签: java for-loop

我在教自己如何编码。 这是一本书的练习。 我能够立刻编写for循环。 为什么我很难将这个for循环转换为for each。 我错过了什么或做错了什么。感谢。

/**
 * Exercise 4.75 
 * Add a method busiestHour to LogAnalyzer that returns the busiest hour
 * You can do this by looking into the hour counts array to find the element
 * with the biggest count.
 * Hint: Do you need to check every element to see if you have found the busiest
 * hour? If so, use a for loop or a for-each loop. Which one is better in this case.
 */

public int busiestHour(){
    int max = hourCounts[0];
    int counter = 0;
    for(int index = 0; index < hourCounts.length; index++){
        if(max < hourCounts[index]){
            max = hourCounts[index];
            counter = index; 
        }
    }
    return counter;
}

/**
 * for each version my attempt
 */
public int busiestHour2()
{
   int max = hourCounts[0];
   int counter = 0;
   for(int index : hourCounts){
       if(max < hourCounts[index]){ 
          max = hourCounts[index];
          counter = index;          
       }
    }
   return counter;
}

2 个答案:

答案 0 :(得分:0)

for-each遍历元素并使用元素而不是索引。因此,for(int index : hourCounts){ index hourCounts实际上已经是{{1}}中的当前元素。换句话说,你有当前小时的计数。例如,如果你遍历一个String数组,那么for-each循环中的变量声明将是String类型,而不是int。这也意味着您根本无法访问索引,除非您自己这样做。

我不会为这个问题展示一个解决方案(这也很难看),但我认为这个练习的目的是向你展示for-each的限制以及经典的for-loop仍然在哪里它的理由。

答案 1 :(得分:0)

如前所述,for each语句遍历列表或元素数组,提供序列中的下一个元素for语句为列​​表或数组提供迭代器,让程序员决定如何使用该迭代器。

对于您的情况,正确的for each语句应为:

public int busiestHour2()
{
   int max = hourCounts[0];
   int counter = 0;
   int index = 0;
   for(int hourCount : hourCounts){
       if(max < hourCount){ 
          max = hourCount;
          counter = index;          
       }
       index = index + 1;
    }
   return counter;
}