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。很遗憾,我不能在这里选择两个答案。我和洪一起去是因为这是第一次。酷…不管怎样,我试着回答你的后续问题。希望有帮助!!