[英]removing entries from a HashMap in Java
所以我有一个哈希图,其中包含作为字符串的键和作为在我的集合中发生的那些字符串的计数的整数的值
例如,我将有一个hashMap如下
Key Value
abcd 4 (meaning there are 4 duplicate strings of abcd in my Set defined someplace)
----- 13
b-b- 7
and so on..
现在,我正在尝试从HashMap中删除所有空字符串条目。 因此,在上面的示例中,我想删除所有值为13的空字符串。因此,我得到的HashMap将是
Key Value
abcd 4
b-b- 7
这是我的代码,试图做到这一点。 考虑到StringIterator是一个我定义的类,它会遍历String的每个字符,所以generateFeedbackMap()是返回HashMap的函数。
for(String key : generateFeedbackMap().keySet()) {
StringIterator it = new StringIterator(key);
int counter = 0;
while(it.hasNext()){
String nextChar = it.next();
if(nextChar.equals("-")){
counter++;
}
Iterator<Map.Entry<String, Integer>> mapIterator = generateFeedbackMap().entrySet().iterator();
if(counter >= key.length()){
while(mapIterator.hasNext()){
Map.Entry<String, Integer> entry = mapIterator.next();
if(entry.getKey().equals(key)){
mapIterator.remove();
}
}
}
}
}
因此,无论我在哪里找到“-”字符,我都会增加计数器。 当计数器等于我的密钥字符串长度(这意味着它是一个空字符串)时,我使用Map Iterator删除了它,但这并没有从我的Map中删除该条目。 我究竟做错了什么?
generateFeedbackMap()
听起来好像您正在获取基础地图的副本,在这种情况下,从副本中删除密钥不会影响基础地图。 如果您实际上正在获取地图,则应重命名方法。
无论如何,以下操作将与原始代码完成相同的操作(但只会从副本中删除)。
Map<String,Integer> feedbackMap = generateFeedbackMap();
for ( String key : feedbackMap.keySet() ) {
if ( key.matches("-+") ) {
feedbackMap.remove(key);
}
}
如果您坚持要获取基础地图的副本,那么您确实需要创建新的helpfulMap
。 但是您仍然可以使用正则表达式和其他Map
函数来加快处理速度:
Map<String,Integer> helpfulMap = new HashMap<>();
for ( Map.Entry<String,Integer> entry : generateFeedbackMap().entrySet() ) {
if ( ! entry.getKey().matches("-+") ) {
helpfulMap.put(entry.getKey(),entry.getValue());
}
}
好的,我想我想出了一个解决方案。 我只是将所有当前条目从oldMap复制到新定义的HashMap中,该键的键中至少包含一个字母。 所以从本质上讲,我摆脱了对字符串的所有删除和迭代,而只使用另一个HashMap,如下所示
Map<String, Integer> HelpfulMap = new HashMap<String,Integer>();
for(String key : generateFeedbackMap().keySet()) {
StringIterator it = new StringIterator(key);
while(it.hasNext()){
String nextChar = it.next();
if(!nextChar.equals("-")){
HelpfulMap.put(key, generateFeedbackMap().get(key));
}
}
}
我不知道我以前在做什么。 我去洗个澡,想出了这个主意,它奏效了。 我喜欢编程!
感谢大家的投入!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.