【问题标题】:How to update a value, given a key in a java hashmap made of LinkedLists?给定由 LinkedLists 组成的 java hashmap 中的键,如何更新值?
【发布时间】:2016-10-18 16:07:02
【问题描述】:

这是我的HashMap

HashMap<String, LinkedList<LinkedList<String>>> partitionMap = new HashMap<String, LinkedList<LinkedList<String>>>();

我知道使用 put 方法可以工作,例如:

hashmap.put(key, hashmap.get(key) + 1);

但是在这个例子中我们有Integer,在我的例子中我有一个LinkedList&lt;LinkedList&lt;String&gt;&gt;&gt;

有没有办法做到这一点?

【问题讨论】:

  • “有没有办法做同样的事情?” >> ,然后通过调用它的方法来修改它......例如hashmap.get(key).add(....)
  • 是更新链表的内容还是链表本身?
  • 如果我执行 hashmap.get(key).add(...) 它会返回错误,因为 add 方法返回一个布尔值。那就是问题所在。我想更新 LinkedList 本身。
  • 如果您使用的是 java 8,我建议您查看 putIfAbsent()computeIfAbsent()computeIfPresent()merge()
  • @user840718 所以?只需忽略返回值。只需调用 hashmap.get(key).add(....) 就足以修改列表。它们不是一成不变的。如果你想用一个完整的新对象替换它,只需调用 hashmap.put(key, new LinkedList>())。

标签: java list linked-list hashmap


【解决方案1】:

put 仍然可以正常工作。您可以将一对新的String,LinkedList&lt;LinkedList&lt;String&gt;&gt; 放入地图中:

LinkedList<LinkedList<String>> aList = new LinkedList<LinkedList<String>>();
hashmap.put("aString", aList);

或者,更简洁

hashmap.put("aString", new LinkedList<>());

然后修改地图内的一个链表,get它,然后修改它。

hashmap.get("aString").add(new LinkedList<String>());

您无需将修改后的列表放回地图中。当您获得对地图中列表的引用时,您正在修改地图中当前的列表。


顺便说一句,你确定你想要LinkedList&lt;LinkedList&lt;String&gt;&gt;吗?访问外部 LinkedList 中的任意 LinkedList 将花费线性时间,这意味着编辑其中一个嵌套 LinkedList 的内容将花费(最佳情况)线性时间,并且可能与二次方一样糟糕。

我建议使用 ArrayList&lt;List&lt;String&gt;&gt; 代替(或将 List&lt;List&lt;String&gt;&gt; 实例化为 ArrayList&lt;List&lt;String&gt;&gt;)。这样您就可以在恒定时间内访问任意嵌套列表,并且嵌套列表中使用的特定 List 实现保持打开状态。

【讨论】:

    【解决方案2】:

    是的,当然:

    LinkedList<LinkedList<String>>> list = hashmap.get(key);
    LinkedList<LinkedList<String>>> updatedList = updateListValue(list);
    hashmap.put(key, updatedList);
    

    现在,updateListValue(LinkedList&lt;LinkedList&lt;String&gt;&gt;&gt; list) 的代码当然取决于您所说的“更新值”。

    【讨论】:

      【解决方案3】:

      如果您使用的是 Java8+,则可以使用方法 computecomputeIfPresentcomputeIfAbsent

          HashMap<String, LinkedList<LinkedList<String>>> partitionMap = new HashMap<String, LinkedList<LinkedList<String>>>();
          partitionMap.computeIfAbsent("key-1", key -> new LinkedList<>()); //add
          System.out.println(partitionMap);
          partitionMap.computeIfPresent("key-1", (key, value) -> {value.add(new LinkedList<>()); return value;}); //update
          System.out.println(partitionMap);
      

      compute* 方法将返回值

      输出

      {key-1=[]}
      {key-1=[[]]}
      

      【讨论】:

        猜你喜欢
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 2020-06-26
        • 2011-10-09
        • 2021-04-11
        • 1970-01-01
        相关资源
        最近更新 更多