遍历项目列表的算法(存储在用户播放歌曲历史中的歌曲)

时间:2013-08-29 15:20:13

标签: algorithm traversal

我正在尝试开发用于遍历表示我的应用程序中歌曲列表的数据结构的算法。

该列表包括我已播放的所有歌曲(我的演奏历史)以及我将播放的其他歌曲。

Something like this (example):
  • H song 1
  • H song 2
  • H song 3
  • H song 4

  • 目前正在播放歌曲

  • 队列5中的Q歌

  • 队列6中的Q歌
  • 队列7中的Q歌
  • 队列8中的Q歌

我需要实现“上一个”和“下一个”按钮,以便我可以移动播放列表。

每次播放歌曲都会存储在历史记录中。

我需要有效的算法(不需要代码,只是想法或伪代码)来解决用户播放歌曲时的所有用例。

例如,一种情况可能是:

在历史上有歌曲1,2和3.现在我们播放歌曲4,之后的历史状态是1,2,3和4。 让我们说我们点击“上一个”按钮再次播放以前播放的歌曲。现在历史状态是1,2,3,4和3(歌曲3在歌曲4之前播放)。 再次单击“上一步”按钮,然后新的历史记录状态为1,2,3,4,3和2.

让我们说现在我们点击队列中的一首歌曲,例如歌曲6.历史状态是1,2,3,4,3,2和6.点击“上一个” 按钮现在应播放歌曲2并将该歌曲添加到历史记录的顶部(状态:1,2,3,4,3,2,6,2))。

如果我可以开发某种数据结构,这将使我的历史状态保持一致,哪种意愿将会很好 如果看一下历史的顶端,总是给我以前的歌。

因此,这个数据结构并不适用于该问题。它保持了历史的状态,但我无法弄清楚我是怎样的 可以简单地遍历历史。

如果我改变数据结构,但是如果能够完成两个请求,那么遍历算法可能会更简单 (具有历史信息并且有可能简单地获得以前播放的歌曲)?

非常感谢所有愿意为这次讨论作出贡献的人。现在好了,我需要那个算法     http://starvibes.com的音乐播放器,在我的观点中将成为“下一件大事”。

3 个答案:

答案 0 :(得分:1)

有2个列表肯定听起来像是要走的路 - 你的历史列表和主列表。

您还需要在历史列表中使用迭代器。无论何时单击上一个或下一个,都会递减或递增此迭代器并获取该迭代器的值。如果单击新歌曲,请将迭代器重置为列表背面(最近播放的)。

每当歌曲开始播放时,将其添加到历史列表中(无论是新歌还是您下次或之前点击过)。

您的示例:(^表示迭代器的位置)

Command   History
--------------------------------
          1, 2, 3
                ^
Play 4
          1, 2, 3, 4
                   ^
Previous
          1, 2, 3, 4, 3
                ^
Previous
          1, 2, 3, 4, 3, 2
             ^
Play 6
          1, 2, 3, 4, 3, 2, 6
                            ^
Previous
          1, 2, 3, 4, 3, 2, 6, 2
                         ^

当我想到像Winamp这样的东西时,你有一个列表而不是一个队列(这意味着你可以选择要播放的任何歌曲,之后它会从那里继续)(除了它还有一个单独的队列,但是那就是重点......)

除非您使用随机播放模式,否则您可能还需要主列表中的迭代器,这将指示最近的新歌(即手动选择的最后一首歌曲或通过点击next在历史列表的末尾)。

这将允许您在历史记录列表末尾点击next后,转到主列表中的顺序下一首歌曲。

答案 1 :(得分:0)

您可以创建自己的数据结构,灵感来自LinkedList,例如,每个元素都知道下一个和上一个元素。

存储您的历史记录,当前元素,然后存储此结构中的下一个元素。 当用户播放新歌时,您应该能够快速将其插入列表中。

然后跟踪当前(播放条目) 当用户单击上一个时,播放currentEntry.previous() 当用户单击下一步时,播放currentEntry.next()

当用户选择其他歌曲时,请在currentEntry和currentEntry.next()之间插入歌曲,然后播放...

干杯

答案 2 :(得分:0)

我只会将所有歌曲编入索引。

然后存储当前歌曲的值并持续。

在遍历大量歌曲时,这将导致O(1)速度。比链接列表好多了。

例如,next()和previous()将只是一个简单的++和 - 在当前歌曲索引上。最后一个只存储最后一首歌的索引。

似乎很简单。


插入 - 添加新歌(++ songlistsize); O(1)

remove - for(i = index; i< songlistsize; i ++)songindex [i] - ; 0(n)的

move - 交换歌曲索引。 O(1)