我目前正在研究一种从音乐库创建播放列表的方法。这个想法是,它要求歌曲的最低评级和播放列表的最短运行时间,然后生成符合这些标准的随机歌曲列表。如果没有足够的最低评级的歌曲,则会将评级降低 1,然后查找满足该要求的歌曲。 (因此,如果您指定播放列表应包含 60 分钟的 5 星歌曲,但您没有足够的时间,它会尝试用 4 星歌曲来填充其余时间。)
但是,如果我的库不包含 5 星歌曲,则会在我的代码中导致无限循环。 (或者我假设是这样,无论如何,测试程序不会停止运行)为什么会这样?
public Playlist createPlaylist(int minRating, int minDuration) {
minDuration = minDuration * 60;
ArrayList<Track> shuffledList = trackList;
Playlist playlist = new Playlist();
Collections.shuffle(shuffledList);
int playlistDuration = 0;
while (playlistDuration <= minDuration) {
for (Track track : shuffledList) {
if (track.getRating() >= minRating && !playlist.contains(track))
{
playlist.add(track);
playlistDuration += track.getLength();
}
if (playlistDuration >= minDuration) {
break;
}
}
minRating--;
}
playlist.randomise();
return playlist;
最佳答案
由于 playlistDuration
是有条件更新的,因此可能有多种原因导致循环无限。例如,如果 shuffledList
为空,您的 playlistDuration
将保持为零,因此外部循环将是无限的。
如果在进入循环之前将 minDuration
调整为 shuffledList
的总持续时间,则可以避免这种情况:
minDuration = Math.Min(minDuration, shuffledList.Sum(t => t.getLength()));
用简单的英语来说,这意味着“我不能要求超过 shuffledList
总持续时间的最短持续时间”。
您还应该将 while
循环的条件更改为严格的“小于”,否则当 shuffledList
为空时,无限循环将会保留。
while (playlistDuration < minDuration) {
...
}
关于java - 为什么我的代码会导致无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26759737/