我正在尝试开发遍历数据结构的算法,这些数据结构代表了我的应用程序中的歌曲列表。
这个列表包括我已经演奏过的所有歌曲(我的演奏历史)和我将要播放的其他歌曲。
Something like this (example):我需要实现‘以前’和‘下一步’按钮,以便我可以移动我的播放列表。
每一次播放歌曲,它都存储在历史上。
我需要高效的算法(不需要代码,只需要想法或伪代码)来解决用户播放歌曲时的所有用例。
例如,一种情况可以是:
历史上有歌曲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音乐播放器的算法,这将是‘下一个大事’在我的作品。
发布于 2013-08-29 15:35:47
有两个清单听起来肯定是要走的路-你的历史清单和你的主要清单。
还需要在历史列表中添加一个迭代器。无论何时单击“上一次”或“下一次”,都会减少或增加该迭代器,并获取该迭代器的值。如果您单击一首新歌,请将迭代器重置到列表的后面(最近一次播放)。
每当一首歌开始播放时,将它添加到历史列表中(不管它是一首新歌,还是单击了next或前次)。
示例:(^表示迭代器的位置)
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之后,在历史记录列表的末尾,依次转到主列表中的下一首歌曲。
发布于 2013-08-29 19:37:35
您可以在LinkedList上创建自己的数据结构,例如,每个元素都知道下一个和前一个元素。
存储历史记录、当前元素,然后在此结构中存储下一个元素。当用户播放一首新歌时,您应该能够快速地将它插入列表中。
然后跟踪当前(播放条目)当用户单击前一个,播放currentEntry.previous()当用户单击下一步,播放currentEntry.next()
当用户选择其他歌曲时,在currentEntry和currentEntry.next()之间插入歌曲,然后播放.
干杯
https://stackoverflow.com/questions/18514917
复制相似问题