【问题标题】:How to implement sorted Multivalue Tree map which always returns non null value如何实现始终返回非空值的排序多值树映射
【发布时间】:2020-07-13 02:23:01
【问题描述】:

由于 Struts 的原因,我需要一个始终返回非空值的排序映射。

对于我的具体案例,我有以下实现,效果很好

public class NonEmptyMap extends TreeMap<String, List<MyObject>> {
    @Override
    public List<MyObject> get(Object key) {

        final List<MyObject> result = super.get(key);
        if (result == null) {
            super.put((String) key, new NonEmptyList<MyObject>(MyObject.class));
        }
        return super.get(key);
    }

}

NonEmptyList 是一个特殊版本的列表,它总是返回非空对象。例如 nonEmptyList.get(2) 调用大小为 1 的 nonEmptyList 将是创建 2 个空的 MyObject 对象的原因,将它们插入列表并将最新元素返回给客户端调用。

我想概括实现以支持任何Key/Value

有没有现成的库实现?

【问题讨论】:

    标签: java collections guava apache-commons treemap


    【解决方案1】:

    虽然我很确定您的列表实现不会遵守List 合同(即如果索引超出范围(index &lt; 0 || index &gt;= size())get() 应该抛出,除非您愿意从size() 返回MAX_INTEGER,但这可能导致其他意外结果...),您可以使用自定义ListMultimap 使用Multimaps#newListMultimap(Map, Supplier&lt;List&gt;)

    static <K extends Comparable<K>, V> ListMultimap<K, V> create(Class<V> valueClass) {
        return Multimaps.newListMultimap(new TreeMap<>(), () -> new NonEmptyList<>(valueClass));
    }
    

    【讨论】:

    • 这是正确的,但 ListMultimap 不可迭代,这对我来说是个问题
    • TreeMap 也不是?
    • 是的,Multimap is not a Map,但我回答了ListMultimap 不是可迭代的问题,并说TreeMap 也不是(不实现Iterable)。如果您想以类似地图的方式使用Multimap,请使用Multimap.asMap() view
    • Multimap 不是Map 的部分原因是您在问题中的实现是无效的Mapget 不应该通过合同修改支持映射Map.
    猜你喜欢
    • 2019-10-22
    • 2017-09-27
    • 1970-01-01
    • 2019-01-05
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多