HashMapJava的前两个入口

HashMapJava的前两个入口,java,hashmap,Java,Hashmap,有没有办法,我可以得到hashmap的前两个入口?我这样试过了,但没用 for (Map.Entry<Integer, Integer> entry : m.entrySet()) { System.out.println(entry.getValue()); m.remove(entry.getKey(), entry.); System.out.println(entry.getValue());

有没有办法,我可以得到hashmap的前两个入口?我这样试过了,但没用

for (Map.Entry<Integer, Integer> entry : m.entrySet()) {
            System.out.println(entry.getValue());
            m.remove(entry.getKey(), entry.);
            System.out.println(entry.getValue());
        }
您的问题是关于查找,但您的代码是关于删除。通常,如果要从正在迭代的集合中删除条目,请非常小心地处理

HashMap的文档明确禁止您执行的操作

公共集入口集

如果 在对集合进行迭代时修改映射,但 通过迭代器自己的remove操作,或通过setValue 迭代器返回的映射项上的操作 迭代是未定义的


通常安全的方法是使用显式迭代器,如果只需要映射中的任意两个值,则使用。

    Map<Integer, Integer> m = Map.of(6, 9, 1, 3, 4, 2);
    
    Iterator<Integer> intIterator = m.values().iterator();
    if (intIterator.hasNext()) {
        System.out.println(intIterator.next());
        if (intIterator.hasNext()) {
            System.out.println(intIterator.next());
            
        }
    }
您注意到,打印的值在任何意义上都不是我想到的前两个值

如果要将前两个条目添加到映射中,请使用LinkedHashMap。默认情况下,它保持插入顺序

如果需要与两个最小键对应的值,请使用流:

    Map.Entry<Integer, Integer> smallest = m.entrySet()
            .stream()
            .min(Map.Entry.comparingByKey())
            .orElseThrow();
    Integer secondSmallest = m.entrySet()
            .stream()
            .filter(e -> ! e.getKey().equals(smallest.getKey()))
            .min(Map.Entry.comparingByKey())
            .map(Map.Entry::getValue)
            .orElseThrow();
    
    System.out.println("" + smallest.getValue() + ' ' + secondSmallest);
3.2

HashMap中以未定义元素顺序而闻名的前两个条目是什么意思?HashMap不会对条目施加顺序。那么你说的前两个是什么意思?前两个被添加到地图上?前两个是按钥匙的顺序排列的吗?还有别的吗?试试LinkedHashMap。
    Map.Entry<Integer, Integer> smallest = m.entrySet()
            .stream()
            .min(Map.Entry.comparingByKey())
            .orElseThrow();
    Integer secondSmallest = m.entrySet()
            .stream()
            .filter(e -> ! e.getKey().equals(smallest.getKey()))
            .min(Map.Entry.comparingByKey())
            .map(Map.Entry::getValue)
            .orElseThrow();
    
    System.out.println("" + smallest.getValue() + ' ' + secondSmallest);