我有一个带有键和值的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);
}
}
还有,不用正则表达式,还有其他方法可以做到吗?
答案 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-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));