HashMapJava的前两个入口
有没有办法,我可以得到hashmap的前两个入口?我这样试过了,但没用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());
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);