removing entries from a HashMap in Java
所以我有一个hashmap,它包含键作为字符串,值作为在我的集合中发生的那些字符串的计数的整数。
例如,我会有一个如下的哈希图
1 2 3 4 5 6
| Key Value
abcd 4 (meaning there are 4 duplicate strings of abcd in my Set defined someplace )
----- 13
b -b - 7
and so on.. |
现在我要做的是从哈希图中删除所有空字符串条目。所以在上面的例子中,我想删除所有值为13的空字符串。所以我得到的哈希图是
号
这是我的代码,它试图做同样的事情。generatefeedbackmap()是一个函数,它返回考虑到的哈希映射StringIterator是一个类,我定义了该类,它遍历字符串的每个字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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迭代器删除它,但这不会从我的映射中删除条目。我做错什么了?
- 你为什么有这些"-"字?为什么你不在把它们放进哈希图之前忽略它们呢?
- 实际上,这是我制作的一个绞刑游戏的一部分。我需要一个初始正常模式下的空字符串,但我目前正在另一个模式下工作,我想删除哈希映射中的所有空字符串。
- 你有一个条目和一堆——还是有多个条目和——s?您要删除的任何条目只有-?
- 我有多个条目。例如,我将有10个--s项,或者我将有56个k项--o项,或者我将有79个没有任何字母的字符串项,比如--
- 为什么不只是if ( key.matches("^-+$") )?
generateFeedbackMap()使它听起来像是您得到了底层映射的副本,在这种情况下,从副本中删除一个键不会影响底层映射。如果你真的得到了地图,那么你应该重新命名你的方法。
无论如何,下面的代码将完成与原始代码相同的工作(但只会从副本中删除)。
1 2 3 4 5 6
| Map <String,Integer > feedbackMap = generateFeedbackMap ();
for ( String key : feedbackMap. keySet() ) {
if ( key. matches("-+") ) {
feedbackMap. remove(key );
}
} |
号
如果您一直无法获得底层映射的副本,那么您需要创建新的helpfulMap。但是您仍然可以使用正则表达式和其他Map函数来加快速度:
1 2 3 4 5 6
| 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在键中至少包含一个字母。所以本质上,我去掉了所有对字符串的删除和迭代,只使用另一个hashmap,如下所示
1 2 3 4 5 6 7 8 9 10
| 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 ));
}
}
} |
我不知道我以前在做什么。我洗了个澡,想出了这个主意,效果很好。我喜欢编程!
感谢大家的投入!
- 这似乎有点低效:1.多次调用generateFeedbackMap(),2。如果键有多个非破折号,则为multiple put,3。创建新映射而不是从旧映射中删除。但如果能完成任务…
- 是的,看起来是这样,但是如果你能帮我找到比我非常感激的更好的解决方案!