【问题标题】:how to store data in Java with key name and its value?如何使用键名及其值在 Java 中存储数据?
【发布时间】:2011-02-05 05:09:35
【问题描述】:

我有一种情况,我想用一个键和它的值将数据存储在一个对象中。键名相同,但值已更改。我尝试使用哈希映射,但它也不支持这一点。它会覆盖所有值并只给我最近的一对值。

我的问题是:有什么类或方法可以帮助我解决这个问题吗?

【问题讨论】:

标签: java collections map


【解决方案1】:

使用什么数据结构

如果要求为单个键存储多个值,那么使用multimap 将是一个不错的选择。

这种多映射的一个实现是来自Google Guava 库的Multimap

Guava 中的Multimap 接口有多种实现,具体取决于键和值的多样性和顺序的要求。

选择实现

一个简单的实现是HashMultimap,其中键映射的值不允许重复,并且键的顺序不是决定性的。

ArrayListMultimap 保留映射到键的值的顺序,按照它们映射到键的顺序。

【讨论】:

    【解决方案2】:

    如果您需要跟踪多个值,您可以在 Map 中使用 List 值。如果满足您的要求,您可以使用 List 中的最后一个值是最新值的假设。

    创建这样的映射可以这样完成(尽管您的键和值类型不必是字符串,它们可以是您使用的任何类):

    Map<String, List<String>> map = new HashMap<String, List<String>>();
    

    然后要获取给定键的最新值,您需要获取相应列表的最后一个元素:

    List<String> list = map.get(key);
    String value = null;
    if (list != null) {
       value = list.get(list.size() - 1);
    }
    

    要向 Map 添加值,如果新键不存在值,则需要添加逻辑以创建新列表,否则将新值添加到列表末尾:

    if (map.get(key) == null) {
        List<String> list = new ArrayList<String>();
        list.add(value);
        map.put(key, list);
    }
    else {
        map.get(key).add(value);
    }
    

    【讨论】:

    • 如果这样做有意义,请考虑子类化 HashMap 以便将此逻辑封装在一个类中。提供putgetLastgetAll等简单接口。
    • 是的,或者像其他一些帖子所建议的那样,可能只包含一个 Multimap 实现。这些让我忘记了,我过去使用过一个,它非常方便。
    • 您能否为上述问题提供一个 Core JAVA 示例。这真的很有趣,如果您可以通过示例提供您的帮助,我们将不胜感激。
    【解决方案3】:

    Java 的标准集合不包括所谓的“多映射”类,但其他几个集合库提供了此功能。例如:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2017-02-15
      • 2011-01-01
      • 2016-04-29
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      相关资源
      最近更新 更多