Как удалить запись с буквенно-цифровым значением в HashMap с помощью регулярного выражения? - PullRequest
1 голос
/ 17 апреля 2019

У меня есть 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 ]

2 голосов
/ 17 апреля 2019

Помимо регулярного выражения, недопустимо изменять карту, перебирая таким образом набор ключей. Может выдать 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 голос
/ 17 апреля 2019

Я полагаю, что removeIf может быть вариантом здесь keySet

keyValueRecord.keySet().removeIf(k -> keyValueRecord.get(k).matches("^[a-zA-Z0-9]"));
0 голосов
/ 17 апреля 2019

Если я правильно понял вопрос, вы хотите удалить запись, если значение имеет буквенно-цифровой код. Например

Введите: {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));
0 голосов
/ 17 апреля 2019

С Java8 вы можете написать это следующим образом:

keyValueRecord.entrySet().stream()
 .filter((k, v) -> k.matches("^[a-zA-Z0-9]+"))
 .collect(toMap(MapEntry::getKey, MapEntry::getEntry))
0 голосов
/ 17 апреля 2019

Здесь: ^[a-zA-Z0-9]

, что соответствует one aZ, 0-9 символов.Вы имели в виду ^[a-zA-Z0-9]+ вместо 1 или более?!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...