当前位置: 首页 > 知识库问答 >
问题:

remove()修改最后一个条目

洪弘壮
2023-03-14
Map<Integer,String> map = ...
  map.put(1,"one");
  map.put(2,"two");
  map.put(3,"three");
  map.put(4,"four");
  map.put(5,"five");
  map.put(6,"six");
  map.put(7,"seven");
  map.put(8,"eigth");
  map.put(9,"nine");

现在我要在这个映射上进行迭代,并使用迭代器移除第n个元素。

private void remove(int num, final Map<Integer, String> map) {

  Iterator<Map.Entry<Integer,String>> it = map.entrySet().iterator();
  Map.Entry<Integer,String> entry;
  while(it.hasNext()){

     entry = it.next();

     if(Integer.valueOf(num).equals(entry.getKey())){
        it.remove();
        System.out.println(entry.getValue());
        // vs
        // System.out.println(entry.getValue());
        // it.remove();
     }
  }
}

我想从javadoc中,remove的语义已经定义好了。

但是,根据映射的实现(即HashMap与TreeMap)的不同,it.remove()是在entry.getvalue()之前还是之后执行是有区别的。

...
remove(4, map); //output: four
//or
remove(5, map); //output: five
System.out.println(entry.getValue());
it.remove();

中的结果

remove(4, map); //output: four
//or
remove(5, map); //output: five

到目前为止还不错,但是如果我在访问条目之前删除该元素:

it.remove();
System.out.println(entry.getValue());

输出出乎意料

remove(4, map); //output: five !!!
//or
remove(5, map); //output: five ok

编辑:TreeMap迭代器的源代码。remove()

共有1个答案

葛言
2023-03-14

map.entryJavadoc中:

如果在迭代器返回项之后修改了支持映射,则映射项的行为是未定义的,除非通过对映射项的setValue操作

和来自map.entry.getValueJavadoc:

 类似资料:
  • 问题内容: 我想知道用JPA获取表的最后一个条目的最佳方法是什么。在Sql中,我正在寻找的将是: 我当时在考虑model.count(),但这听起来更像是一种破解,而不是一个好的解决方案;) 问题答案: 您可以使用看起来与查询非常相似的。 建立后,您可以致电 其次是 编辑:我的错误:请注意下面的mtpettyp的注释。 不要使用query.getSingleResult(),因为如果返回的行不完全

  • 问题内容: 我在MSSQL2005中有下表 现在我想根据business_key分组,返回具有最高ID的完整条目。所以我的预期结果是: 我敢打赌,有一种方法可以实现这一目标,但目前我还看不到。 问题答案: 替代解决方案,可能会给您带来更好的性能(双向测试并检查执行计划): 该查询假定该ID是唯一值(至少对于任何给定的business_key而言),并将其设置为NOT NULL。

  • 问题内容: 这是我一直在绞尽脑汁的一个问题。假设我有一个表,该表具有一系列时间戳和一个零件号作为主键。该表存储增量更改,这意味着对于每个时间戳记,如果字段更改,则记录该更改。如果该字段保持不变,则对于新的时间戳,该字段为NULL。这是基本思想。 是主键。第二条记录中的s表示自第一条记录以来未更改的值。 我想要做的是为按零件分组的每个字段选择最新值。例如,给定以上条目,a5部分的结果将为153,5,

  • 问题内容: 示例代码: 我想更改最后一个字母的颜色,在这种情况下为“ g”,但我需要使用CSS的解决方案,不需要JavaScript解决方案。 我逐个字母显示字符串,我不能使用静态解决方案。 问题答案: 不使用JavaScript,您唯一的选择是: 编辑您的小提琴链接 : 我不太确定为什么您说您不需要JavaScript解决方案,因为您已经有了很多解决方案。无论如何,在此示例中,您只需要进行一些小

  • 问题内容: 有没有办法只选择目录中的最后一个文件(带有扩展名?) 还是我必须解析整个目录并使用检查? 问题答案: 是的,您必须通读它们。但是由于目录访问已被缓存,因此您不必担心。

  • 问题内容: 我有一个jar文件,它在html文件中用作applet。我想修改jar文件的内容并重建jar文件,以便html与新的jar文件配合使用。我怎样才能做到这一点?? 我已经尝试使用7zip解压缩,并修改了源代码并创建了新的jar。但是当我在html中使用它时会显示一些java.lang.Classnotfound错误 问题答案: 您可以根据需要解压缩或重新解压缩类和源文件。 解开 罐 ht