【问题标题】:How do I remove the last input from java HashMap using LinkedHashMap? [duplicate]如何使用 LinkedHashMap 从 java HashMap 中删除最后一个输入? [复制]
【发布时间】:2021-03-24 21:52:23
【问题描述】:

我需要删除 HashMap 的最后一个输入,然后添加一个新输入。我听说你可以使用 LinkedHashMap 来做到这一点,但具体如何呢?说明没有提到我应该使用 LinkedHashMap,但显然,没有它就不可能从 HashMap 中删除最后一项。

或者,如果您有任何替代解决方案可以删除最后一项以便我可以添加其他输入,请告诉我应该在代码中添加什么。

这是我想要做的:

package studentlist;
import java.util.LinkedHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class StudentList {

    public static void main(String[] args) {
        
        Map<String, String> students = new HashMap<>();
        
        Scanner s = new Scanner(System.in);
        
        for(int i=1; i<= 3; i++){
             
            System.out.print("Enter student number " + i + ": ");  
            String es = s.nextLine();
            
            System.out.print("Enter student first name " + i + ": ");
            String en = s.nextLine();
            
            students.put(es, en);
            
        }
      
        for (Map.Entry mp : students.entrySet()) {
            System.out.println(mp.getKey()  +  " "  + mp.getValue());
        }
      
        //The 3rd input should be removed before this:

        System.out.print("Enter your student number: ");  
        String sn = s.nextLine();
            
        System.out.print("Enter your first name: ");
        String fn = s.nextLine();
            
        students.put(sn, fn);
            
        for (Map.Entry mp : students.entrySet()) {
            System.out.println(mp.getKey()  +  " "  + mp.getValue());
        }
    }
}

【问题讨论】:

标签: java input data-structures hashmap linkedhashmap


【解决方案1】:

Map 的 javadoc 说:

Map 接口提供三个集合视图,它们允许将映射的内容视为一组键、值集合或键值映射集。地图的 order 定义为地图集合视图上的迭代器返回其元素的顺序。一些地图实现,如TreeMap 类,对它们的顺序做出具体保证;其他人,比如HashMap 类,不要这样做。

LinkedHashMap 的 javadoc 说:

[LinkedHashMap] 维护一个双向链表,贯穿其所有条目。这个链表定义了迭代顺序,通常是键插入映射的顺序(insertion-order)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。 (如果在调用 m.containsKey(k) 将在调用之前立即返回 true 时调用 m.put(k, v),则键 k 将重新插入映射 m。)

因此,要删除最后一个 inserted(不是 re-inserted)条目,请使用 3 个迭代器中的任何一个,跳到末尾,然后删除该条目:

static <K, V> Entry<K, V> removeLast(LinkedHashMap<K, V> map) {
    Iterator<Entry<K, V>> entryIter = map.entrySet().iterator();
    if (! entryIter.hasNext())
        return null;
    Entry<K, V> entry;
    do {
        entry = entryIter.next();
    } while (entryIter.hasNext());
    entryIter.remove();
    return entry;
}

测试

LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("A", "1");
map.put("E", "5");
map.put("B", "2");
map.put("D", "4");
map.put("E", "6"); // Re-insert
map.put("C", "3");

for (int i = 0; i < 7; i++)
    System.out.println(removeLast(map));

输出

C=3
D=4
B=2
E=6
A=1
null
null

没有人说它会很快,但这就是如何做到这一点,只需Map。如果您需要删除多个条目而不在其间插入新条目,则特别有用。

根据需要,最好只记住旁边的最后一个键。有了它,您可以快速删除最后插入的密钥,但您不能,例如通过执行两次“删除最后一个”来删除倒数第二个键。

【讨论】:

    【解决方案2】:

    只是一些想法:

    • 保留一个变量来存储最后输入的学生
    • 保留 2 个结构(一个列表和一个地图)
    • 将 LinkedHashMap 迭代到末尾以找到最后一个条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-28
      • 2023-04-06
      • 2015-06-05
      • 2014-04-14
      • 1970-01-01
      • 2016-02-20
      • 2017-12-01
      • 1970-01-01
      相关资源
      最近更新 更多