假设我需要存储一组Student对象,并且每个学生都有一个唯一的ID。一种选择是将所有这些存储在列表中,但是当搜索学生时,我必须执行线性搜索并检查他们的id。另一种选择是使用地图,例如:地图,其中键是学生ID,映射到实际的学生对象。
对于给定的问题,这是一种明智的方法吗?一方面它感觉正确,因为我可以通过他们的id很容易地检索学生,但是,另一方面,感觉我稍微冗余地存储了已经存在于学生对象中的id - 所以我&# 39; m类存储它两次,但关键是查找机制。
我的添加内容如下:
public void add(Student s) {
lookup.put(s.getId(), s);
}
答案 0 :(得分:1)
这种冗余可能是您在编程中遇到的唯一一种。
在性能和可读性方面使用具有唯一对象ID的Map的附加值值得这种做法带来的小额开销。
如果你真的觉得这个开销太大了,你放在Map数据结构中的对象可以被剥夺ID属性,ID属性只会被用作键,而在检索过程中你可以推断地图密钥中的ID。
答案 1 :(得分:0)
在这种情况下,没有真正的正确用法。完成构建后,您需要考虑如何使用此集合。你要迭代它吗?你想要排序吗?
当然可以创建一个Map
来自动地将键拉出值,但是,由于迭代或排序可能变得更加困难,因此对此结构的有用性存在限制。
这是CurriedHashMap
这样做你正在考虑的事情。忽略它正在使用HashMap
功能的事实。
class CurriedHashMap<K, V> extends HashMap<K, V> {
/**
* Function that extracts key from value.
*/
final Function<V, K> curry;
public CurriedHashMap(Function<V, K> curry) {
this.curry = curry;
}
/**
* One-value put - the key is intuited from the value using the `curry` function.
*/
public V put(V value) {
return super.put(curry.apply(value), value);
}
}