如何使用正则表达式在HashMap中删除具有字母数字值的条目?

时间:2019-04-17 12:19:00

标签: java regex hashmap

我有一个带有键和值的HashMap。所有键和值都是来自传感器的String类型。例如

map = {
temperature: "35.6",
pressure: "1012",
station_type: "FM-17"
.
.
.
}

现在,我想从地图中删除包含字母数字值的键,在这种情况下为station_type,并且仅保持温度和压力。

我使用正则表达式进行了尝试,但无法正常工作。有人可以告诉我下面的代码有什么问题吗?

for(String m:keyValueRecord.keySet()){
   if(keyValueRecord.get(m).matches("^[a-zA-Z0-9]")){
      keyValueRecord.remove(m);
}
}

还有,不用正则表达式,还有其他方法可以做到吗?

5 个答案:

答案 0 :(得分:2)

除正则表达式外,在以这种方式遍历其键集时修改地图是无效的。它可能会抛出ConcurrentModificationException或产生不确定的结果。

为了在迭代地图时删除元素,您需要显式使用迭代器。

final Iterator<Map.Entry<String, String>> iterator = keyValueRecord.entrySet().iterator();
while (iterator.hasNext()) {
    final Map.Entry<String, String> entry = iterator.next();
    if (entry.getValue().matches("[a-zA-Z0-9]*")) {
        iterator.remove();
    }
}

或者您可以使用Java 8方式:

map.values().removeIf(value -> value.matches("[a-zA-Z0-9]*"));

答案 1 :(得分:1)

我相信removeIf上的选项keySet

keyValueRecord.keySet().removeIf(k -> keyValueRecord.get(k).matches("^[a-zA-Z0-9]"));

答案 2 :(得分:0)

此处:^[a-zA-Z0-9]

一个 a-Z,0-9字符匹配的

。您是说^[a-zA-Z0-9]+而是匹配1个或更多?!

答案 3 :(得分:0)

使用Java8,您可以通过以下方式编写它:

keyValueRecord.entrySet().stream()
 .filter((k, v) -> k.matches("^[a-zA-Z0-9]+"))
 .collect(toMap(MapEntry::getKey, MapEntry::getEntry))

答案 4 :(得分:0)

如果我正确理解了问题,例如,如果该值包含字母数字,则要删除该条目。

输入: {temperature=35.6, pressure=1012, station_type=FM17, station_type3=FM-@17, station_type2=fm, station_type1=FM}

预期输出: {temperature=35.6, pressure=1012, station_type2=fm, station_type1=FM}

   String onlyNumbers = "^[0-9.]*$";
        String onlyAlphabets = "[a-zA-Z]*$";
        final Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            final Map.Entry<String, String> entry = iterator.next();
            if (!entry.getValue().matches(onlyNumbers)&&!entry.getValue().matches(onlyAlphabets)) {
                iterator.remove();
            }
        }

或Java8

  map.entrySet().removeIf(entry->!entry.getValue().matches(onlyNumbers)&&!entry.getValue().matches(onlyAlphabets));