Java 对额外参数使用Hashmap与使用Split

Java 对额外参数使用Hashmap与使用Split,java,android,Java,Android,我正在迭代MediaStore中属于某一类型的曲目。我对它们进行迭代,并创建一个曲目id->流派id的映射,供我的scan tracks方法稍后使用。我所做的与以下类似: private void scanGenres() { // Iterate over genres block start. // Iterate over tracks by a genre start mTracksGenreHashMap.put(trackId, genreId);

我正在迭代
MediaStore
中属于某一类型的曲目。我对它们进行迭代,并创建一个曲目id->流派id的映射,供我的scan tracks方法稍后使用。我所做的与以下类似:

private void scanGenres()
{
   // Iterate over genres block start.
      // Iterate over tracks by a genre start
         mTracksGenreHashMap.put(trackId, genreId);
      // Iterate over tracks by a genre start
   // Iterate over genres block end.
}
我意识到我还需要存储流派名称,而不仅仅是流派id,以供我的曲目扫描方法使用。我有两个选择。我可以创建一个新的
HashMap
,将流派id映射到流派名称。我的另一个方法是将流派名称放入My
mTracksGenreHashMap
HashMap
的值中。第一种选择:

private void scanGenres()
{
   // Iterate over genres block start.
      // Iterate over tracks by a genre start
         mTracksGenreHashMap.put(trackId, genreId);
         mGenreIdToNameHashMap.put(genreId, genreName);
      // Iterate over tracks by a genre start
   // Iterate over genres block end.
}
第二种选择:

private void scanGenres()
{
   // Iterate over genres block start.
      // Iterate over tracks by a genre start
         mTracksGenreHashMap.put(trackId, genreId + ";" + genreName);
      // Iterate over tracks by a genre start
   // Iterate over genres block end.
}
然后,在我的扫描轨迹方法中:

private void scanTracks()
{
    // Iterate over tracks in MediaStore start
        // Get track Id.
        // First option.
        long genreId = mTracksGenreHashMap.get(trackId); 
        String genreName = mGenreIdToNameHashMap.get(genreId);

        // OR

        // Second option
        string[] genreIdName = mTracksGenreHashMap.get(trackId);
        string genreId = genreIdName[0];
        string genreName = genreIdName[1];
    // Iterate over tracks in MediaStore end
}
我想知道哪个解决方案的性能更好。请记住,在每种方法中,我都会循环轨迹。在第一首歌中,我在一个流派中循环播放曲目。在
scanTracks()

谢谢。

听起来“流派”本身就是一个有意义的概念,因此它应该在程序中表示为一个类,而不是表示为跨不同数据结构的条带数据:

class Genre {
    public final String id;
    public final String name;
}

mTracksGenreHashMap.put(trackId, genreObject);
“我想知道哪种解决方案性能更好”

差异太小,在实际用例中没有意义。

听起来“流派”本身就是一个有意义的概念,因此它应该在程序中表示为一个类,而不是跨不同数据结构的条带数据:

class Genre {
    public final String id;
    public final String name;
}

mTracksGenreHashMap.put(trackId, genreObject);
“我想知道哪种解决方案性能更好”


差别太小,在实际的用例中没有意义。

正如@Joni所建议的,使用
类型作为它自己的对象,并带有名称和ID是比较明智的,但是如果您只是想在两种方法之间进行选择,我建议您遵循第一种方法

mTracksGenreHashMap.put(trackId, genreId);
mGenreIdToNameHashMap.put(genreId, genreName);
其中,您将为每个hashmap使用特定的功能用例,并使用第二种方法

        long genreId = mTracksGenreHashMap.get(trackId); 
        String genreName = mGenreIdToNameHashMap.get(genreId);

        // OR

        // Second option
        string[] genreIdName = mTracksGenreHashMap.get(trackId);
        string genreId = genreIdName[0];
        string genreName = genreIdName[1];
我可以看到
genreId
是一个长值,最初在存储时,您必须将
genreId
genreName
组合为一个字符串,在提取时,您必须从字符串执行长强制转换操作,我认为这是不必要的

即使使用
1st方法对任何贴图进行任何更改
,该操作将是原子操作(意味着您将更改map1或map2),但使用
2rd方法
您必须获取并更新这两个值,因为它们是一个完整的字符串

因此,我的建议是使用
1st方法


//快乐学习

正如@Joni所建议的那样,使用
类型作为自己的对象并带有名称和ID会更明智,但如果您只是想在两种方法之间进行选择,我建议您采用第一种方法

mTracksGenreHashMap.put(trackId, genreId);
mGenreIdToNameHashMap.put(genreId, genreName);
其中,您将为每个hashmap使用特定的功能用例,并使用第二种方法

        long genreId = mTracksGenreHashMap.get(trackId); 
        String genreName = mGenreIdToNameHashMap.get(genreId);

        // OR

        // Second option
        string[] genreIdName = mTracksGenreHashMap.get(trackId);
        string genreId = genreIdName[0];
        string genreName = genreIdName[1];
我可以看到
genreId
是一个长值,最初在存储时,您必须将
genreId
genreName
组合为一个字符串,在提取时,您必须从字符串执行长强制转换操作,我认为这是不必要的

即使使用
1st方法对任何贴图进行任何更改
,该操作将是原子操作(意味着您将更改map1或map2),但使用
2rd方法
您必须获取并更新这两个值,因为它们是一个完整的字符串

因此,我的建议是使用
1st方法


//快乐学习

谢谢你的回复。使用像您建议的那样单独的模型会比我的解决方案增加更多的内存使用还是会影响性能?我正在考虑使用这个模型,如果它们都一样的话。我已经有了一个流派模型,稍后我会用数据填充它。我没有在
scaneGenre()
方法中填充流派模型的原因是我确定了
scaneTracks()
方法中的曲目数量。我无法确定
scangree()
的数量,因为我过滤了
scanTracks()
上的曲目。这实际上是一个后续问题:您希望有数百万种流派吗?如果不是,您担心的是错误的事情不是这样,我担心的是,在我上面的代码中,在
scangree()
中,每个曲目id都将链接到一个模型/csv数据。有些用户的手机上可能有2k个音轨。这是我最关心的。对于2k曲目,你需要在曲目和流派之间建立2k链接。1) 这是一个小数字-关注为用户带来价值的实际功能!2) 对共享的不可变类型对象的对象引用占用的空间最小,使用起来非常方便。非常感谢您的回复。使用像您建议的那样单独的模型会比我的解决方案增加更多的内存使用还是会影响性能?我正在考虑使用这个模型,如果它们都一样的话。我已经有了一个流派模型,稍后我会用数据填充它。我没有在
scaneGenre()
方法中填充流派模型的原因是我确定了
scaneTracks()
方法中的曲目数量。我无法确定
scangree()
的数量,因为我过滤了
scanTracks()
上的曲目。这实际上是一个后续问题:您希望有数百万种流派吗?如果不是,您担心的是错误的事情不是这样,我担心的是,在我上面的代码中,在
scangree()
中,每个曲目id都将链接到一个模型/csv数据。有些用户的手机上可能有2k个音轨。这是我最关心的。对于2k曲目,你需要在曲目和流派之间建立2k链接。1) 这是一个小数字-关注为用户带来价值的实际功能!2) 对共享的不可变类型对象的对象引用占用的空间最小,使用起来非常方便