Java 使用Hashmap跟踪原始计数与否

Java 使用Hashmap跟踪原始计数与否,java,android,Java,Android,我正在应用程序启动时扫描MediaStore。我对它进行迭代以获得音频曲目并存储它们。我还存储其他方面,如相册。我将歌曲存储在 ARAYLISTAB/COD>中,这也适用于相册(不同的代码> AlrayList< /Cord>)。这很好,但是我已经开始考虑性能。 我想在扫描时记录每张专辑的曲目数量。因此,我最初使用了唱片集id->曲目计数的哈希映射。对于扫描期间获得的每个曲目,我都会检查HashMap(与唱片集id关联)是否存在。我在它不存在时创建它,否则用计数更新它。然后,在扫描之后,我将遍历

我正在应用程序启动时扫描
MediaStore
。我对它进行迭代以获得音频曲目并存储它们。我还存储其他方面,如相册。我将歌曲存储在<代码> ARAYLISTAB/COD>中,这也适用于相册(不同的代码> AlrayList< /Cord>)。这很好,但是我已经开始考虑性能。

我想在扫描时记录每张专辑的曲目数量。因此,我最初使用了唱片集id->曲目计数的
哈希映射。对于扫描期间获得的每个曲目,我都会检查
HashMap
(与唱片集id关联)是否存在。我在它不存在时创建它,否则用计数更新它。然后,在扫描之后,我将遍历相册
ArrayList
,并使用
HashMap
查找来使用
HashMap
中的信息更新条目

我开始怀疑在这里使用
HashMap
来提高性能是否值得。跳过
HashMap
并使用for循环查找我想要更新的相册,然后更新它,性能会更好吗

谢谢

编辑:因为我不能发布代码,因为它是一个大的块,所以我将简化它。原始代码:

private void scanTracks()
{
    HashMap<Long, Integer> albumHashMap= new HashMap<>();

    // Iterate over tracks in MediaStore Block Start

    // Get albumId.

    if (!albumHashMap.containsKey(albumId))
        albumHashMap.put(albumId, 1);
    else
        albumHashMap.put(albumId, albumHashMap.get(albumId) + 1);

    // Iterate over tracks in MediaStore Block End

    for(Album album : mAlbums)
    {
        album.setCount(albumHashMap.get(album.getId()));
    }
}
我正在应用程序启动时扫描MediaStore。我对它进行迭代以获得音频曲目并存储它们。我还存储其他方面,如相册。我在ArayLIST中存储磁道,也适用于相册(不同的ARARYLIST),这很好,但是我已经开始考虑性能。 有了这个描述,我知道您有一个所有曲目的列表,它不是按唱片集分组的。然后,你有另一张所有专辑的列表

如果是这种情况,使用HashMap,时间复杂度将是O(n+m)
,其中n和m分别是曲目和专辑的计数。还没有用另一种方式来评估绩效,我可以说这是良好绩效的标志

现在,如果你浏览专辑列表中的每一张专辑,然后迭代曲目进行计数,时间复杂度将是
O(m*n)
,这比上面的
O(m+n)
要糟糕得多

因此,在重述中,使用
HashMap

我正在应用程序启动时扫描MediaStore。我对它进行迭代以获得音频曲目并存储它们。我还存储其他方面,如相册。我在ArayLIST中存储磁道,也适用于相册(不同的ARARYLIST),这很好,但是我已经开始考虑性能。 有了这个描述,我知道您有一个所有曲目的列表,它不是按唱片集分组的。然后,你有另一张所有专辑的列表

如果是这种情况,使用HashMap,时间复杂度将是O(n+m),其中n和m分别是曲目和专辑的计数。还没有用另一种方式来评估绩效,我可以说这是良好绩效的标志

现在,如果你浏览专辑列表中的每一张专辑,然后迭代曲目进行计数,时间复杂度将是
O(m*n)
,这比上面的
O(m+n)
要糟糕得多

因此,在重述中,请清楚地使用
HashMap

1st approach

first loop goes for n times
second loop goes for m times (say)

Advantage: overall time complexity O(m+n)
Disadvantage: Additional space complexity O(n) (hashmap)

2nd Apporach

Outer loop goes for n times
    inner loop goes for m times

Advantage: No additional space complexity (no use for hashmap)
Disadvantage: overall time complexity O(m*n)
这是时间和空间复杂度之间的折衷,我想建议第一种方法。

显然

1st approach

first loop goes for n times
second loop goes for m times (say)

Advantage: overall time complexity O(m+n)
Disadvantage: Additional space complexity O(n) (hashmap)

2nd Apporach

Outer loop goes for n times
    inner loop goes for m times

Advantage: No additional space complexity (no use for hashmap)
Disadvantage: overall time complexity O(m*n)

这是时间和空间复杂性之间的折衷,我想建议第一种方法。

我不确定你的问题,你能发布一个示例代码吗?但对于查找问题,始终首选地图。@SabareeshMuralidharan我已更新了我的问题。我不确定您的问题,您能发布此问题的示例代码吗?但对于查找问题,始终首选地图。@SabareeshMuralidharan我已更新了我的问题。您是否有机会检查我的问题编辑?您好@JohnAnderson,您更新的问题确认了我对问题的理解。我的答案仍然有效,正如您在替代实现中所看到的,有一个嵌套循环导致时间复杂度
O(m*n)
。在初始实现中,HashMap操作的时间复杂度通常为
O(1)
,因此整个方法的时间复杂度仅为
O(m+n)
。希望有帮助!谢谢你,洪泰。我很感激。如果你有时间,你能在这里检查我的其他问题吗?你有机会检查我的问题编辑吗?嗨@JohnAnderson,你更新的问题确认了我对问题的理解。我的答案仍然有效,正如您在替代实现中所看到的,有一个嵌套循环导致时间复杂度
O(m*n)
。在初始实现中,HashMap操作的时间复杂度通常为
O(1)
,因此整个方法的时间复杂度仅为
O(m+n)
。希望有帮助!谢谢你,洪泰。我很感激。如果你有时间,你能在这里检查我的其他问题吗?非常感谢你的帮助,Sabareesh Muralidharan。很遗憾,我不能在这里选择两个答案。我和洪一起去是因为这是第一次。酷…不管怎样,我试着回答你的后续问题。希望有帮助!!非常感谢你的帮助,Sabareesh Muralidharan。很遗憾,我不能在这里选择两个答案。我和洪一起去是因为这是第一次。酷…不管怎样,我试着回答你的后续问题。希望有帮助!!