一种删除地图中条目的方法

A way to remove an entry in maps

有人告诉我应该删除映射的最后一个或第三个条目,但我找不到任何关于如何获取特定条目并将其删除的解决方案。

代码如下:

Scanner reader = new Scanner(System.in);
        
    String input1, input2;
    Map<String, String> students = new HashMap<>();
        
        for(int i = 1; i <= 3; i++){
            System.out.print("Enter student number " + i + ": ");
            input1 = reader.next();
            
            System.out.print("Enter first name " + i + ": ");
            input2 = reader.next();
            
            students.put(input1, input2);
        }
        
        System.out.println("Student List:");
        
        for(Map.Entry entry: students.entrySet()){
            System.out.println(entry.getKey() + " - " + entry.getValue());
        }

我试过使用 students.remove(students.get(3), students.get(3)); 但它仍然不起作用。有没有可能的解决方案?请帮忙

请使用 LinkedHashMap.It 扩展 HashMap 并按照插入顺序维护映射中条目的链接列表。

Map<String, String> students = new LinkedHashMap <>();

来自 iterating over and removing from a map 示例:

Map<String, String> map = new HashMap<String, String>() {
  {
    put("test", "test123");
    put("test2", "test456");
  }
};

for(Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); it.hasNext(); ) {
    Map.Entry<String, String> entry = it.next();
    if(entry.getKey().equals("test")) {
        it.remove();
    }
}

你可以这样做


int size = map.entrySet();
int i = 0;
for(Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); it.hasNext(); i++) {

    Map.Entry<String, String> entry = it.next();
    if(i == size - 1) { // last
//     if(i == 2) { // 3rd
        it.remove();
    }
}

不过注意上面的操作对于hashmap可以O(n)LinkedHashMap 正如其他人指出的那样,每次删除时间

可以有一个 O(1)

我认为在你的情况下,直接删除最后一个条目可能就足够了,而不是遍历地图试图找到它。打印条目时使用 LinkedHashMap 保留顺序:

Scanner reader = new Scanner(System.in);
        
String input1, input2;
LinkedHashMap<String, String> students = new LinkedHashMap<>();
        
String last = null;
        
for (int i = 1; i <= 3; i++) {
    System.out.print("Enter student number " + i + ": ");
    input1 = reader.next();
            
    System.out.print("Enter first name " + i + ": ");
    input2 = reader.next();
            
    students.put(input1, input2);
            
    if (i == 3) {
        last = input1;
    }
}
        
students.remove(last);
        
System.out.println("Student List:");
        
for (Map.Entry entry: students.entrySet())
    System.out.println(entry.getKey() + " - " + entry.getValue());
}