如果对象符合特定条件,则从地图中删除条目

时间:2019-03-30 05:14:16

标签: java dictionary

我有一个对象地图,如果对象属性符合特定条件,我想从地图中删除它。

地图如下

Map<String, ExchangeSummaryItem> under20 = mapper.readValue(new URL("https://rsbuddy.com/exchange/summary.json"), new TypeReference<Map<String, ExchangeSummaryItem>>() {});

每个ExchangeSummary都有一个sell_average,sell_quantity和buy_quantity,如果sell_average> 2000,并且买/卖数量均为0,我想将其从地图中删除。

我当前的代码如下,但未成功从地图中删除任何值(地图仍然具有相同的大小)

for (ExchangeSummaryItem item : under20.values()) {
     int ObjSellAverage = item.getSellAverage();
     int ObjSellQ = item.getSellQuantity();
     int ObjBuyQ = item.getBuyQuantity();

     if (ObjSellAverage > 20000 && ObjSellQ == 0 && ObjBuyQ == 0){
          System.out.println(under20.size());
          under20.remove(item);
     }
}

对于为什么发生这种情况的任何帮助,将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

under20.remove(item);用该值调用remove。它需要 key 。 您也不能只转而遍历under20.keySet()并调用remove,因为您会有ConcurrentModificationException

一种简单的解决方法是创建另一张地图:

Map<String, ExchangeSummaryItem> result = new HashMap<>();

//Map.entrySet() gives you access to both key and value.
for (Map.Entry<String,ExchangeSummaryItem> item : under20.entrySet()) {
     int ObjSellAverage = item.getValue().getSellAverage();
     int ObjSellQ = item.getValue().getSellQuantity();
     int ObjBuyQ = item.getValue().getBuyQuantity();

     if (!(ObjSellAverage > 20000 && ObjSellQ == 0 && ObjBuyQ == 0)){
          result.put(item.getKey(), item.getValue());
     }
}

并在result

中使用过滤后的值