我知道HashMap不允许重复键(它允许重复值)。 然而,在这个完美的例子中,所有的值都有相同的键(这意味着键不是唯一的)也许我误解了代码。有人可以帮助我理解它。
这是代码
public class PlayListManager {
//**********************************hashmap keys************************
public static final String ALL_VIDEOS = "AllVideos";
public static final String ALL_Songs = "AllSongs";
//***************************************************************************
..
...
....
while (cursor.moveToNext()) {
Songs song = new Songs();
song.songId = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
song.artist = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
song.title = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
song.songName = cursor
.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
song.duration = Integer.parseInt(cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)));
song.albumId = Integer.parseInt(cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)));
song.songData = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
//*******here it uses the same ky for all the videos?!!*************
HashMap<String, Object> songMap = new HashMap<String, Object>();
songMap.put(ALL_Songs, song);
songsList.add(songMap);
}
}
答案 0 :(得分:3)
在while
循环的每次迭代中,代码都在创建一个 new HashMap
实例,并且只用一个映射String
密钥的条目填充它("AllSongs"
)到Song
对象。
此地图(仅包含一个条目)将添加到列表songsList
。
while
循环完成后,您将获得HashMap
个列表,其中每个地图基本上将硬编码关键字映射到一首歌曲。
songsList:
&lt;“AllSongs”,song1&gt;,&lt;“AllSongs”,song2&gt;,&lt;“AllSongs”,song3&gt;,...
在这种情况下,使用HashMap
似乎是多余的。您可以使用Song
实例填充列表,而无需在地图中保存每个实例。
这里的关键概念是有许多HashMap
(每次迭代创建一个),而不是拥有“全局”HashMap
。如果它是全局的,那么每首歌都会覆盖另一首歌,因为它们总是使用相同的硬编码密钥进行映射。