java - 为什么我的代码会导致无限循环?

标签 java infinite-loop

我目前正在研究一种从音乐库创建播放列表的方法。这个想法是,它要求歌曲的最低评级和播放列表的最短运行时间,然后生成符合这些标准的随机歌曲列表。如果没有足够的最低评级的歌曲,则会将评级降低 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/

相关文章:

java - 在 Web 应用程序中不使用 JavaScript 或 JQuery 时防止多次提交按钮点击?

java - 内聚性和耦合性——如何确定阈值?

java - Jersey REST - 将 MultivaluedMap 发送到 GET 会导致不支持的媒体类型

Python:尝试编写连接四的变体:获胜条件不会停止

java - 改造。如果 (!response.isSucessful()) 得到响应

java - 阿姆斯特朗数java代码有问题

C++ MiniMax算法陷入井字棋板的无限循环

php - laravel artisan 使用未定义的常量 STDIN - 假设 'STDIN' 无限循环

c++ - 当对象陷入无限循环时被销毁会发生什么?

c - 没有循环的 Fork-Exec 炸弹