【问题标题】:Is it possible to get previous stored value in Hashmap?是否可以在 Hashmap 中获取先前存储的值?
【发布时间】:2018-12-04 12:44:05
【问题描述】:

假设我有一个哈希图。 HashMap<String,String> hm = new HashMap<String,String>(); 现在我在这张地图中放了一些值,如下所示。 hm.put("A","First"); hm.put("B","First");

在此之后,我再次为已存储的键“A”设置了一些值。

hm.put("A","Second");

现在,如果我尝试获取 "A" 的值,我将得到 "Second" 作为它的值。

sysout(hm.get("A"));

输出 Second

有没有办法获得以前的值,即"First"

非常感谢您的帮助。

【问题讨论】:

  • 该值被覆盖。无法获得先前的值。您必须实现自己的逻辑来捕获它。
  • 我被问到了同样的问题,我也回答了同样的答案,因为值被覆盖了,所以这是不可能的。但是面试官说没有办法得到之前的值。
  • 使用put返回的结果。如果是null,则没有映射到该键。如果结果不为 null,则您有与键关联的先前值。
  • 为什么你的例子有两个初始put语句,即hm.put("A","First"); hm.put("B","First");?这两个映射与获得"First" 的愿望之间是否有任何关系?你想得到它是因为"A" 以前映射到它还是因为"B"hm.put("A","Second"); 之前已经与它关联?还是整个事情都是关于“以前”的实际含义的诡计问题?

标签: java collections hashmap


【解决方案1】:

不,您可以使用列表作为值。于是就变成了:

Map<String, List<String>> map = ...;

然后您可以从列表中添加或删除元素,以便能够检索以前的值。

map.get(key).add(value);

这将添加到地图中的列表中,当搜索最近的值时,您可以使用

List<String> list = map.get(key);
String value = list.get(list.size()-1);

【讨论】:

    【解决方案2】:

    要获取之前的值,可以将 put 方法的返回值赋给字符串

    hm.put("A","First");
    String temp = hm.put("A","Second");
    System.out.println(temp); // prints first
    

    【讨论】:

      【解决方案3】:

      据我所知,您可以通过两种方式做到这一点:

      1. 检查旧key返回的值是否返回值 (即null 与否)。现在您可以在放置之前捕获该值 该键的新值。

        插图:

        HashMap<String, String> hmap = new HashMap<>();     
        hmap.put("A", "First");
        
        if (hmap.get("A") != null) {        
            String oldValue = hmap.get("A");        
            hmap.put("A", "Second");    
        }
        
      2. 我们知道put()方法返回前一个的值 键

        将指定的值与此映射中的指定键相关联。如果 映射先前包含键的映射,旧值是 换了。

        @return 与键关联的上一个值

        所以你可以这样做:

        String oldValue = hmap.put("A", "Second");
        

      【讨论】:

      • 感谢您的回答,但我想知道我们是否可以获取当前已更改的先前值,因为有人告诉我有一种方法可以获取先前的值。现在我不好的是我没有机会问他怎么做。 :(
      • 获取当前更改的先前值 -- 你是什么意思?
      • hmap.get("A") 在更改后给我"First" 的任何方式 (hm.put("A","Second");)
      • 是的。在上面的答案中,您将获得以前的值,即First,然后将其替换为Second。我建议你试试看。
      • 这就是我的做法 - 可以是上面提到的 println 声明,也可以将其存储在其他 List 等其他地方。所以我要 +1。
      【解决方案4】:

      嗯,有很多机会可以实现这一目标,问题是您希望将值保存到多深。您还需要 10 次看跌操作后的第一个值吗?需要排序吗?

      您可以通过 HashTable 以未排序的方式实现此目的,请参阅 Java HashTable: https://docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html

      Hashtable<Key, Element> table;
      

      排序方式可能是,使用堆栈或其他东西:

      HashMap <Key,Stack<Element>> values;
      

      https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html

      所以你可以像这样访问第一个元素

      values.get("A").peek();
      

      如果您必须访问堆栈中的随机元素,请为此使用 LinkedList:

      HashMap<Key,LinkedList<Element>> values;
      values.get("A").getFirst();
      values.get("A").getLast();
      

      如果您使用类似 HashMap 的方法,请确保始终覆盖 hashCode() 和 equals() 方法。

      【讨论】:

        【解决方案5】:

        法线贴图不能这样工作。在法线贴图中,旧值会被覆盖并消失。

        然而,有一个类似地图的数据结构,它保存了已放入地图的值的集合:multi-map

        例子:

        ListMultimap<String, String> m = ArrayListMultimap.create();
        
        m.put("A", "First");
        m.put("A", "Second");
        
        for (String s : m.get("A")) {
            System.out.println(s);
        }
        
        // Prints:
        // First
        // Second
        

        多地图在很多情况下使用起来非常方便,非常值得学习。

        此处的示例代码使用来自 Guava 库的多映射。可以从Maven Repository下载。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-17
          • 2016-01-17
          • 1970-01-01
          相关资源
          最近更新 更多