【问题标题】:Correct usage of storing objects in maps正确使用在地图中存储对象
【发布时间】:2016-02-01 11:18:27
【问题描述】:

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

对于给定的问题,这是一种明智的方法吗?一方面感觉不错,因为我可以通过他们的 id 轻松检索学生,但另一方面,感觉就像我稍微多余地存储了学生对象中已经存在的 id - 所以我排序存储两次,但关键是查找机制。

我的添加是这样的:

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

【问题讨论】:

  • 我就是这么做的。您还可以在学生对象上实现 equals() 和 hashCode 方法
  • 数据结构与感觉无关

标签: java dictionary collections


【解决方案1】:

愿这种冗余是您在编程中唯一会遇到的。

在性能和可读性方面,使用具有唯一对象 id 的 Map 的附加价值是值得这种做法产生的小开销。

如果你真的觉得这个开销太大,你放在 Map 数据结构中的对象可以去掉 ID 属性,ID 属性只会用作键,而不是在检索时,你可以推断映射键中的 ID。

【讨论】:

    【解决方案2】:

    在这种情况下没有真正的正确用法。完成构建后,您需要考虑如何处理此集合。你要迭代它吗?你要排序吗?

    当然可以创建一个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);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多