Как изменить значение Hashmap, в котором ключ и значение имеют значение Strings, а значение - это отдельная строка, состоящая из значений, разделенных запятыми - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь изменить Hashmap. «Значение» - это отдельная строка, состоящая из значений, разделенных запятыми. (например: «помощь = abc, bid = def, cid = gh2»)

Мне нужно заменить определенные значения из них на соответствующее значение из БД. (например, изменение ставки на 123, что приведет к приведенной выше строке 'value' в виде: "aid = abc, bid = 123, cid = gh2")

А затем установите измененное «значение» на соответствующий ключ, чтобы хэш-карта состояла из измененных значений.

Я пытался перебирать ключи, и с картой (ключом), которая даст значение, я пытался преобразовать это в список значений, разделенных запятыми, а затем перебирать этот список и в каждой строке, если Я нахожу 'bid' (пример строки выше), затем я делаю необходимые манипуляции и затем возвращаю его обратно в Hashmap (что я не смог сделать, так как строки не изменяемы)

для (имя строки: outputMap.keySet ())
List urlList = Arrays.asList (outputMap.get (name) .split (",")); для (int i = 0; i

ожидаемый результат: "aid = abc, bid = 123, cid = gh2" (после манипуляции) фактический результат: невозможно сделать.

Я использовал Stringbuffer для проблем, где нужно было изменить строку, но немного опасался использовать это здесь, так как здесь уже происходит несколько преобразований.

Код должен соответствовать Java 7, поскольку он развертывается на клиентском компьютере, все еще использующем некоторую устаревшую среду (их планируется перенести на Java 8, но это запланировано гораздо позже) Любая помощь здесь будет оценена.

1 Ответ

0 голосов
/ 16 мая 2019
static Map<String, String> replace(Map<String, String> map, String toReplace, String replacement) {
    return map.entrySet().stream()
                         .collect(Collectors.toMap(Entry::getKey, 
                       e -> transformValue(e.getValue(), toReplace, replacement)));
}

static String transformValue(String value, String toReplace, String replacement) {
    return Arrays.stream(value.split(","))
            .map(pair -> pair.split("="))
            .map(sPair -> sPair[0] + "=" + (toReplace.equals(sPair[0]) ? replacement : sPair[1]))
            .collect(Collectors.joining(","));
}

это будет перебирать все записи карты и создавать новую карту с измененными значениями. Пример:

var map = Map.of("key1", "aid=abc,bid=def,cid=gh2");
System.out.println(replace(map, "bid", "123").get("key1"));

напечатает aid=abc,bid=123,cid=gh2

...