我有相当大的散列(一些10M键),我想从中删除一些元素。如何在迭代时删除散列元素?
我通常不喜欢使用delete
或splice
,我最终复制了我想要的而不是删除我不想要的东西。但是这一次,由于散列非常大,我想我想直接从它中删除。
所以我在做这样的事情:
foreach my $key (keys %hash) {
if (should_be_deleted($key)) {
delete($hash{$key});
}
}
而且它似乎工作确定。但是..如果我想在迭代它们之前删除一些元素呢?我将举例说明:
foreach my $key (keys %hash) {
if (should_be_deleted($key)) {
delete($hash{$key});
# if $key should be deleted, so does "$key.a", "kkk.$key" and some other keys
# I already know to calculate. I would like to delete them now...
}
}
我想一些可能的解决方案 - 比如检查是否有键仍然存在,如在环或第一循环的第一步,创建密钥的列表中删除(并没有实际删除他们),然后在另一个循环中实际删除。
您对此有何看法?
UPDATE
这似乎是双通的办法有一个共识。然而,从第一遍的过程中我仔细检查已经标记为删除的键是非常低效的。这是有点递归的,因为不仅我检查了密钥,还计算了应该删除的其他密钥,尽管它们已经由原始密钥计算出来了。
也许我需要使用一些更加动态的数据结构遍历键,将动态更新?
***“我仔细检查按键之前所有的哈希键的列表那已经标记为删除“***看到我的解决方案节俭的替代 – Borodin 2015-07-11 15:20:04