如何使用linkedhashmap从java hashmap中删除最后一个输入?

6bc51xsx  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(869)

这个问题在这里已经有答案了

java linkedhashmap获取第一个或最后一个条目(15个答案)
26天前关门了。
我需要从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());
        }
    }
}
jobtbby3

jobtbby31#

只是一些想法:
在存储最后输入的学生的位置保留一个变量
保留2个结构(列表和Map)
将linkedhashmap迭代到末尾以查找最后一个条目。

yhxst69z

yhxst69z2#

的javadoc Map 说:
map接口提供了三个集合视图,允许将map的内容视为一组键、一组值或一组键值Map。Map的顺序定义为Map集合视图上的迭代器返回其元素的顺序。一些map实现,比如 TreeMap 对其订单作出具体保证;其他人,比如 HashMap 同学们,不要。
的javadoc LinkedHashMap 说:
[linkedhashmap]维护一个贯穿其所有条目的双链接列表。这个链表定义了迭代顺序,通常是键插入到Map中的顺序(插入顺序)。请注意,如果将键重新插入到Map中,则插入顺序不受影响(钥匙 k 重新插入Map m 如果 m.put(k, v) 在以下情况下调用 m.containsKey(k) 会回来的 true 在调用之前。)
因此,要删除最后一个插入的(不是重新插入的)条目,请使用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 . 如果您需要删除多个条目而不在其中插入新条目,则特别有用。
根据需要,最好只记住侧面的最后一个键。这样,您就可以快速删除最后一个插入的键,但不能通过执行两次“删除最后一个”来删除最后一个键。

相关问题