2014-11-04 1 views
0

저는 현재 음악 라이브러리를 가져와 지정된 최소 재생 시간의 랜덤 재생 목록을 생성하는 재생 목록 기능을 만들려고합니다. 사용자가 최소 등급을 취한다는 아이디어가 있지만 재생 목록을 채우기에 충분한 등급의 트랙이 없으면 minimumRating - 1 트랙으로 이동합니다. 따라서 60 분짜리 별 5 개 트랙을 원했지만 충분하지 않은 경우 프로그램은 나머지 별 4 개짜리 트랙으로 채우기를 시도합니다.arraylist에서 for-loop의 끝에 도달했는지 확인하는 방법은 무엇입니까?

그래서 for 루프의 끝에 도달하면 minimumRating을 감소시킨 다음 다시 설정하는 방법이 필요합니다. for-loop가 끝났을 때 무언가를 반환하는 메서드 (예 : 부울 값)가 ​​있습니까?

가 도움이 경우

, 내 현재 코드는 여기에서 찾을 수 있습니다 :

public ArrayList<Track> createPlaylist(final int minRating, int minDuration) { 
    minDuration = minDuration * 60; 
    final ArrayList<Track> shuffledList = trackList; 
    final ArrayList<Track> playlist = new ArrayList<Track>(); 
    Collections.shuffle(shuffledList); 
    int playlistDuration = 0; 
    int myMin = minRating; 
    while (playlistDuration < minDuration && myMin > 0) { 
     for (final Track track : shuffledList) { 
      if (track.getRating() >= myMin && !playlist.contains(track)) { 
       playlist.add(track); 
       playlistDuration += track.getLength(); 
      } 
     } 
     myMin--; 
    } 
    return playlist; 
} 
+1

왜 별 정렬 된 목록을 60 분에 네 개의 루프를 종료하지? 그리고 여전히 for (;;) - 루프 구문이 있습니다. – Christian

답변

1

당신이 뭔가를 할 수 있습니다 당신은 클래스를 만들 수 있습니다. 재생 목록 :

public class Playlist { 
    private final List<Track> playlist = new ArrayList<Track>(); 
    private int playlistDuration = 0; 

    public void addTrack(Track track) { 
     playlist.add(track); 
     playlistDuration += track.getLength(); 
    } 

    public int getDuration() { 
     return playlistDuration; 
    } 

    public List<Track> getPlaylist() { 
     return playlist; 
    } 

    public void shufflePlaylist() { 
     Collections.shuffle(playlist); 
    } 
} 

코드에 라인을 많이 깎에 대한 루프 같을 것이다 당신 :

public ArrayList<Track> createPlaylist(int minRating, int minDuration) { 
    minDuration = minDuration * 60; 
    playlist.shufflePlaylist(); 

    while (playlist.getDuration() < minDuration) { 
     for (Track track : trackList) { 
      if (track.getRating() >= minRating) { 
       playlist.addTrack(track); 
      } 
      if (playlist.getDuration() > minDuration) { 
       return; 
      } 
     } 
    } 
    return playlist; 
} 
+0

고마워, 내가 왜 이러한 가치의 많은 최종 (minRating, shuffledList 등) 이유는 배울 관심이 있어요 그것은 새로운 과제를 중지 알아요,하지만 그게 유익한 이유는 무엇입니까? – Zetland

+0

변수가 바뀌지 않는다는 것을 명확하게 말하면됩니다. – jjlema

+0

그러나 minRating이'int myMin = minRating;'줄을 변경하고 제거하지 못하게하는 이유는 무엇입니까? – Zetland

1

내 마음에 와서 가장 먼저하는 일이 있다는 것입니다 :

public ArrayList<Track> createPlaylist(int minRating, int minDuration) { minDuration = minDuration * 60; ArrayList<Track> shuffledList = trackList; ArrayList<Track> playlist = new ArrayList<Track>(); Collections.shuffle(shuffledList); int playlistDuration = 0; while (playlistDuration < minDuration) { for (Track track : shuffledList) { if (track.getRating() >= minRating) { playlist.add(track); playlistDuration += track.getLength(); } } } return playlist; }

+0

좋은 대답입니다. 고마워요. 나는 약간 혼란 스럽지만. 'createPlaylist' 메쏘드는'Library' 클래스에 속해 있습니다. 그래서이 메쏘드는 어떻게 실제로'Playlist' 객체를 생성합니까? – Zetland

+0

당신은 Playlist 객체를 메소드 외부의 필드로 정의했다고 가정했습니다. createPlaylist 메소드 안에 새로운 Playlist 객체를 만들 수 있습니다. – muffin

0
public ArrayList<Track> createPlaylist(int minRating, int minDuration) { 
    minDuration = minDuration * 60; 
    ArrayList<Track> sortedList = trackList; 
    ArrayList<Track> playlist = new ArrayList<Track>(); 
    Collections.sort(sortedList, Collections.reverseOrder()); // implements comparable at rating 
    int playlistDuration = 0; 

    for (Track track : sortedList) { 
     playlist.add(track); 
     playlistDuration += track.getLength(); 
     if (playlistDuration > minDuration) 
      break; 

    } 

    Collections.shuffle(playlist); 
    return playlist 
} 
관련 문제