正确使用在地图中存储对象

时间:2016-02-01 11:18:28

标签: java dictionary collections

假设我需要存储一组Student对象,并且每个学生都有一个唯一的ID。一种选择是将所有这些存储在列表中,但是当搜索学生时,我必须执行线性搜索并检查他们的id。另一种选择是使用地图,例如:地图,其中键是学生ID,映射到实际的学生对象。

对于给定的问题,这是一种明智的方法吗?一方面它感觉正确,因为我可以通过他们的id很容易地检索学生,但是,另一方面,感觉我稍微冗余地存储了已经存在于学生对象中的id - 所以我&# 39; m类存储它两次,但关键是查找机制。

我的添加内容如下:

public void add(Student s) {
     lookup.put(s.getId(), s);
}

2 个答案:

答案 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);
    }

}