【问题标题】:How do i store many Values with one Key如何用一个键存储多个值
【发布时间】:2012-09-03 17:07:39
【问题描述】:

我想在 1 个键中存储 3 个值。 一个Hashmap只能保存1个key,1个value,所以不能使用。 那么我还有什么其他方法可以从一键获取 Value A/B/C.

键:字符串

值:字符串/字符串/整数

【问题讨论】:

  • 还有(非标准 API)MultiMap 实现 ..(我不推荐这里,因为会丢失输入记录,但要记住一些事情)
  • 我对 HashMaps/Maps/Lists 真的很陌生。所以很难理解你讨论的解决方案。我试着理解并检查这个例子。但我无法得到解决方案。所以如果有一个完整的工作示例。我可以从中学习并从那里开始工作。

标签: java store key-value


【解决方案1】:

创建一个对象来保存您的 3 个值,然后新对象就是您在键值对中的值。

这是一个示例实现:

class TripleValue {
    String A;
    String B;
    int C;

    public TripleValue(String a, String b, int c) {
        A = a;
        B = b;
        C = c;
    }
}

public static void main() {
    Map<String, TripleValue> myMap = new HashMap<String, TripleValue>(); 
    myMap.put("SomeKey", new TripleValue("String1", "String2", 10));

}

【讨论】:

  • 例如class Triple { String A; String B; int C; }
  • 如果值列表是动态的,这个解决方案可能不够优雅。
  • @Nambari True 但 OP 将值列为 String/String/int
  • 非常感谢。就一个问题。如何返回 TripleValue 的值?我尝试了迭代器,但没有用代码: for (Entry entry : myMap.entrySet()) { System.out.println(entry.getValue()); }
  • 您需要将其更改为:System.out.println(entry.getValue().A)。 getValue() 仅返回 TripleValue 对象。然后,您需要访问 TripleValue 对象的差异属性。
【解决方案2】:

其中一种方法可以使用 ArrayList/Set 作为键的值。

例子:

List myTempList = new ArrayList();
myTempList.add("Hi");
myTempList.add("Hello");
myTempList.add("How are you");

myMap.key("key", myTempList);

另一种方法是,如果您知道每个键的值的数量总是相同的,那么您可以创建一个持有者对象并为该对象设置值并将其放入地图中。

【讨论】:

  • 使用始终包含 3 个元素的异构 List 可能不是一个好主意。
  • @oldrinb:是的,我的理解是值不是预定义的,如果它们是我同意你的说法。用另一种可能的解决方案更新了答案。
【解决方案3】:

Java 框架不支持Multimap,有办法绕过它,见下文。

Map<Object,ArrayList<Object>> multiMap = new HashMap<Object,ArrayList<Object>>();

也可以看看这个库Guava-libraries

【讨论】:

    【解决方案4】:

    试试

    Map<Integer, List<yourObject>> m = new HashMap<>();
    

    然后您将需要检查该列表是否存在某个键。如果是这样,请添加到列表中。否则创建一个 ArrayList 并添加它

    例如:

    public add(String key, MyObj myobj){
        if (this.contains(key) ) { 
            this.get(key).add(myObj);
        }else {
            List<MyObject> list = new ArrayList<MyObject>();
            list.add(myObj);
            m.put(key, list);
        }
    }
    

    【讨论】:

    • 在声明的m 类型之后缺少&gt;。此外,从 Java 7 开始,您可以允许编译器推断创建的 HashMap 的参数化类型,即 new HashMap&lt;&gt;()
    • 是的,好点@oldrib。我总是忘记钻石运算符!
    • @oldrinb 什么意思:“推断创建的HashMap 的参数化类型” - 使用此功能的代码会是什么样子?
    • @yoshi 查找钻石运算符。答案在使用菱形运算符的 HashMap 声明的末尾有
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2016-09-13
    • 2021-01-29
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多