所以我有一个hashmap,其中包含键作为字符串,值为整数,表示我的Set
中出现的字符串的数量例如,我将有一个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
这是我的代码,试图做同样的事情。 generateFeedbackMap()是一个返回HashMap的函数,StringIterator是我定义的一个类,它迭代遍历字符串的每个字符。
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中删除该条目。我做错了什么?
答案 0 :(得分:1)
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());
}
}
答案 1 :(得分:0)
好的伙计们,我想我找到了解决方案。我刚刚将所有当前条目从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));
}
}
}
我不知道我之前在做什么。我去洗个好淋浴,想出了这个想法并且有效。我喜欢编程!
感谢大家的投入!