【问题标题】:Clear values of type List in a HashMap清除 HashMap 中 List 类型的值
【发布时间】:2013-11-20 15:51:29
【问题描述】:

我正在使用 HashMap 来存储键/值对。键包含重复项,值是列表。每当有新键出现时,我想清除值列表。到目前为止我的代码是

Map<Integer, List<Integer> > bandsMap = new HashMap< Integer, List<Integer> >();
List<Integer> erfcn = new ArrayList< Integer >();

for(int i=0 ; i<frequencies.length; i++)
    erfcn.add(frequencies[i]);

bandsMap.put( band_number, erfcn);

我在这里所做的是我有一个频率数组,我将数组的值添加到我的列表中,然后将列表放入我的地图中。当band_number相同时,它可以正常工作。

假设如果在前 10 次 band_number = 20 中,它只是在列表中添加新值,并在我的 Map 中添加带有 key=20 的列表。但是当新密钥到达时,它也会将新内容添加到旧密钥中。

是否可以通过某种方式检查该键是否与前一个键相同,然后简单地将列表放入映射中,否则先清除列表然后将其添加到映射中?

谢谢

【问题讨论】:

    标签: java list hashmap


    【解决方案1】:

    听起来您只创建了一次erfcn 列表。每个bandsMap.put 调用都将同一个列表对象与所有不同的键相关联。相反,您需要为 each band_number 创建一个new 列表。如果存在,您还需要重新使用该键的现有列表。

    所以,移动这一行:

    List<Integer> erfcn = new ArrayList< Integer >();
    

    远离bandMap的声明。直接在添加频率的函数内部声明,如下:

    List<Integer> erfcn = bandsMap.get(band_number);
    if (erfcn == null) erfcn = new ArrayList<Integer>();
    

    【讨论】:

    • 为每个乐队编号创建新列表重要吗?
    • 获取频率并将其存储在列表中的函数可能会被调用 1000 次以获取相同的频段编号
    • @UmairIqbal 是的,否则您总共只有一个列表对象,并且每个键都指向具有相同项目的同一对象。每个band_number 需要一个列表。
    【解决方案2】:

    您可以从 Map 获取密钥的 List 并附加到它。

    List<Integer> erfcn = bandsMap.get(band_number);
    

    如果get(band_number) 返回null,则创建一个新的List

    if (erfcn == null) {
      erfcn = new ArrayList<>();
    }
    

    【讨论】:

    • 需要检查 erfcn 是否为空来创建新列表,不是吗? :P
    • 积极帮助了 OP ;)
    • 我还建议您查看来自Guava 的Multimaps。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2021-09-11
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多