【问题标题】:Removing all values from HashMap but keeping the keys? [closed]从 HashMap 中删除所有值但保留键? [关闭]
【发布时间】:2016-07-02 19:42:02
【问题描述】:

我正在尝试删除我的HashMap 中与所有keys 关联的所有values,但仍然保留密钥

以下是正确的/最有效的方法吗?

 for (Map.Entry<Kennel, List<Dog>> entry : hashMap.entrySet()) {
            String key = entry.getKey().getId();
            List<Dog> dogList = entry.getValue();

            //Loop through the list associated with each key and delete each Dog in the list
            for (int i=0; i<dogList.size(); i++){

                dogService.delete(dogList.get(i));
                dogService.save(dogList.get(i));


            }

        }

【问题讨论】:

  • 我不知道您要在这里完成什么,但如果您只想要唯一键,那么您可能应该使用 HashSet 而不是 HashMap
  • 你想达到什么目的? Map.keySet() 将返回所有的密钥,如果你把它们放在一个新的集合中,你得到的只是密钥的副本。
  • 什么是dogService
  • @java123999 这不是您要解决的问题,而是您认为合适的解决方案
  • 鉴于您的代码,我认为您根本不需要删除这些值。您可以通过重新考虑您需要实现的目标以及您如何接近解决方案来走得更远。你所要求的既奇怪又不必要。

标签: java for-loop data-structures hashmap


【解决方案1】:

更简单:

for(dogs : hashMap.values()) {
    for(dog : dogs) {
        dogService.delete(dog);
        dogService.save(dog);
    }
    dogs.clear();
}

【讨论】:

  • delete 方法呢>
【解决方案2】:

我不知道您要在这里完成什么,但如果您只想要唯一键,那么您可能应该使用 HashSet 而不是 HashMap

但是,如果您想执行删除,您可以执行以下操作:

for (Kennel key : hashMap.keySet()) {
    hashMap.put(key, null);
}

我已经写了Kennel key,假设您的HashMap 的键是Kennel 类型。

【讨论】:

  • 我认为这不是 OP 想要的
  • @EngineerDollery 你所说的重复键是什么意思?
  • 如果是HashMap,这将抛出ConcurrentModificationException,如果是ConcurrentHashMap,则会抛出NPE
  • @SashaSalauyou:我不太确定。这里只修改了值。密钥集保持不变...我的测试还说:“没有例外”。
  • @fabian 是的,伙计们,你是对的:在这种情况下也不例外。但恕我直言,这仍然是一种不好的做法。
【解决方案3】:

你可以在最后使用:

hashMap.put(entry.getKey(), null);

删除整个列表,但是如果您以后想将新狗放入其中(我认为您想要),并且您的狗列表是可修改的,则以下方法更便于记忆:

for (Map.Entry<Kennel, List<Dog>> entry : hashMap.entrySet()) {
    String key = entry.getKey().getId();
    Iterator<Dog> it = entry.getValue().iterator();
    while (it.hasNext()) {
        Dog dog = it.next();
        dogService.delete(dog);
        dogService.save(dog);
        it.remove();
    }
}

因为您避免在将来分配新列表。还要注意it.remove() 的用法,它允许在迭代时删除

【讨论】:

  • 你说的如果你以后想用是什么意思?
  • 刚刚编辑了我的答案
  • 好吧,如果他想在未来提出新的价值观,他总是可以做到hashMap.put(key, new ArrayList&lt;Dogs&gt;());
  • 他将分配一个新的数组列表,这可以通过重用现有的来避免
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2022-11-29
  • 2012-12-08
  • 2021-01-28
  • 1970-01-01
  • 2018-11-28
相关资源
最近更新 更多