2016-03-01 79 views
0

是否有另一種方法可以在不使用數組的情況下編寫此方法,如使用for eachif語句?我只想看看是否有更簡單的寫法。不使用數組編寫此方法的另一種方法

/** 
* Write a method that prints the number of movies of each star rating 
*/ 
public void printRatingReport() 
{ 
    int[] numMovies = new int[5]; 
    for (Movie m : movies){ 
     numMovies[m.getStarRating()]++; 
    } 

    for (int i=0; i<=4; i++){ 
     System.out.println(i+ " star movies " + numMovies[i]); 
    } 
} 
+0

一個「更簡單」的寫法呢?我不希望如此。這與我所能想象的一樣簡單。 –

+0

@LouisWasserman有些人甚至會使用Streams而不是使用循環。 ;)看到我的答案。 –

+0

@PeterLawrey他甚至沒有使用長度來獲得數組的長度,並且你建議他使用lambda表達式?你確定你簡單嗎? –

回答

3

使用Java 8,你可以做

SortedMap<StarRating, Long> starCount = movies.stream() 
      .collect(Collectors.groupingBy(m -> m.getStarRating(), 
              TreeMap::new, Collectors.counting()); 

starCount.forEach((rating, count) -> System.out.println(rating + " star movies " + count)); 
+1

理想情況下,星級評分將被替換爲一個枚舉,而不是一個int,這個代碼將很好地處理。 – Chill

+0

@Chill好主意。 –

0

使用枚舉。這樣你就可以使用foreach,並且可能將評分系統從5星改爲2,6或更多,因爲代碼會更有凝聚力。

enum Stars { 
    One, Two, Three, Four, Five 
} 

public void starRatingReport() { 
    for (Stars starRating : Stars.values()) { 
     int number = 0; 
     for (Movie movie : movies) { 
      if (movie.getRating() == starRating) { 
       number++; 
      } 
     } 
     System.out.println(number + " Movies with rating " + starRating); 
    } 
} 

你也可以使用屬性,但在我看來他們有點複雜。