for循环的递归永远不会停止。无法找到我的错误

时间:2016-03-03 17:03:50

标签: java android for-loop recursion

我正在为Android创建一个音乐播放器,而我正在尝试实现一个计时器功能,您可以在其中设置一个持续时间,该应用会为您提供具有此持续时间的播放列表。我认为用递归做这件事会很好。这是我的代码:

变量:

maxLength = [any value in seconds] ... Wanted duration for the ArrayList with songs
currentLength = 0 ... current Duration of the ArrayList
timerSongs = new ArrayList<Song>() ... the ArrayList with the playlist
allSongs ... ArrayList with all the songs I have on my device

这里是调用以向timerSongs添加项目的空白

private void addSongs(int index, long maxLength){

    if (currentLength<=maxLength){
        timerSongs.add(allSongs.get(index));

        currentLength = currentLength
            + TimeUnit.MILLISECONDS.toSeconds(allSongs.get(index).getDuration());

        for (int i = 0; i < allSongs.size() && currentLength != maxLength; i++){
            Log.e("Index", String.valueOf(i));
            addSongs(i, maxLength);
        }
    } else {
        currentLength = currentLength
            - TimeUnit.MILLISECONDS.toSeconds(timerSongs.get(timerSongs.size()-1).getDuration());
        timerSongs.remove(timerSongs.size()-1);
    }
}
编辑:我想做的是:

  1. 让应用程序将歌曲添加到arrayList(timerSongs),直到它太长

  2. 删除太长的歌曲

  3. 添加下一首歌曲,如果持续时间(currentLength)太长,请再试一次。如果是,请再次将其删除

  4. 对所有下一首歌曲执行第3步

  5. 如果持续时间仍然不正确,请设置新的forelast歌曲,然后重新执行上述步骤

    依旧......

  6. 我无法找到错误......但是Log.e("Index", String.valueOf(i));总是给我相同的值:0。经过一段时间后,应用程序因堆栈溢出而崩溃。因此看起来递归永远不会停止。有没有人在我的代码中看到错误?问题是什么?

    提前致谢

3 个答案:

答案 0 :(得分:0)

for循环永远不会&#34; ++&#34;因为它等待addSongs方法完成执行。当使用i == 0运行for循环时,执行相同的方法一次又一次地创建for循环,其总是具有0作为我的基本int。从逻辑上讲,这并没有停止。尝试用以下方法替换for循环:

if(currentLength != maxLength){
  addSongs(index + 1, maxLength);
}

答案 1 :(得分:0)

好吧,虽然我个人认为使用这种递归的解决方案非常糟糕,但你应该改变这一行

for (int i = 0; i < allSongs.size() && currentLength != maxLength; i++){

for (int i = 0; i < allSongs.size() && currentLength <= maxLength; i++){

答案 2 :(得分:0)

我解决了我的问题。

如果有人感兴趣,请输入以下代码:

private void addSongs(int index, long maxLength){

        if (TimeUnit.MILLISECONDS.toSeconds(currentLength) <= maxLength){
            int i;
            for (i = 0; i < songList.size() && TimeUnit.MILLISECONDS.toSeconds(currentLength) != maxLength; i++){
                    timerSongs.add(songList.get(i));
                    currentLength = currentLength + songList.get(i).getDuration();
                    addSongs(i, maxLength);
            }
            if (i >= songList.size()){
                currentLength = currentLength - timerSongs.get(timerSongs.size()-1).getDuration();
                timerSongs.remove(timerSongs.size()-1);
            }
        } else {
            currentLength = currentLength - timerSongs.get(timerSongs.size()-1).getDuration();
            timerSongs.remove(timerSongs.size()-1);
        }

}