每个工程师都应该知道的关于Hashmap的知识( 三 )


一个常见的用例是在对象列表之间进行联接 。例如,假设我们有一个像这样的对象:
public BookDTO { private String id; private String name;}
假设我们有2个BookDTO列表:"用户喜欢的图书"和"正在销售的图书" 。企业所遵循的逻辑是,他们希望向用户展示用户喜欢的,正在出售的书籍 。为此,我们需要找到两个列表都通用的所有书籍 。
一种方法是浏览用户喜欢的每一本书,并浏览每本出售的所有书籍 。这将是不理想的,因为它涉及经历所有可能的组合 。
一种替代方法是从2个列表中制作2个地图,每个地图ID到BookDTO 。然后,浏览用户喜欢的每本书,使用该ID从另一张地图中拉出所有正在出售的书 。使用这种方法,我们只需遍历地图即可加入任何相关书籍,而不必尝试每种组合 。

每个工程师都应该知道的关于Hashmap的知识

文章插图
 
分组信息通过一些通用属性对信息进行分组是很常见的事情 。例如,假设我们要计算一个字符串在任意字符串列表中出现的次数 。
表示其输出的一种方法是将String映射为Integer 。该代码可以编写如下:
public Map<String, Integer> countItems(List<String> items) {Map<String, Integer> stringToCount = new HashMap<>();for (String item in items) {if (!stringToCount.containsKey(item)) {stringToCount.put(item, 0); }Integer currentCount = stringToCount.get(item);Integer newCount = currentCount + 1; stringToCount.put(item, newCount);}return stringToCount;}因此对于输入:
["Foo", "Bar", "Foo", "Baz"]
输出为:
{ "Foo": 2, "Bar": 1, "Baz": 1}
这是一个相对简单的示例,但是如果您正在处理事务并决定要按用户对用户的所有事务进行分组,则将它们表示为用户ID到List [Transaction]的映射可能是实现该分组的一种有用方法。
什么哈希图不好存储订购的信息如果您想以有序的方式存储信息,则哈希映射不是很好 。通常,哈希图不保证可以迭代其条目的顺序,因此您不能依赖于已将订单项添加到与迭代顺序有任何关系的哈希图中的顺序 。
这里有一些反例 。在Java中,存在LinkedHashMap类,该类允许按插入顺序迭代条目 。还有一些排序的映射,可以按顺序迭代具有显式顺序的键 。
存储重复信息哈希图中的键定义值的身份 。如果您尝试为同一键存储多个值,则这些值将被覆盖 。这与可以多次重复添加同一对象的列表不同 。
解决此问题的简单方法是将要存储的值更改为多次插入的对象的列表 。
摘要哈希图是一种非常有用的数据结构,用于将某些任意数据映射到其他任意数据 。
他们依靠良好的哈希函数,模数函数和"存储桶"列表 。
地图的一些标准用例是将2个数据集合结合在一起,或通过一些公用密钥将数据分组在一起 。
关于作者嗨,我是Doogal,我是一位技术主管,花了很多年的时间从几位非常有才华的人那里学习软件工程,而这些故事正是我努力使之付诸实践的方法 。
在担任技术主管期间,我曾指导过许多新软件工程师,并且我发现经常存在工程师不知道自己不知道的情况的情况 。因此,"每个软件工程师应该知道的事情"系列是我在做软件的第一年里会给自己提供的信息的摘要 。
软件是一个很大的主题,黄金法则是,任何问题的答案都可以以"取决于……"开头,因此,这些故事中的信息并不完整 。这是一种尝试提供基本信息的尝试,因此在阅读这些故事时,请记住,兔子洞比此处显示的主题要深 。
我可以在Facebook,LinkedIn或Doodl.la上找到 。
(本文翻译自Doogal Simpson的文章《Things every engineer should know: Hashmaps》,参考:https://medium.com/swlh/things-every-engineer-should-know-hashmaps-b354088206b5)




推荐阅读