Логика c для разбиения строк на карту может быть одинаковой для обоих, поскольку у них одинаковый синтаксис.
То, что вы использовали для первой строки, было не совсем правильным, так как фильтр, который вы применяли каждой строке из результата разбиения, а не в самом результате массива. Что также показало, что вы использовали [] на keyValuePair, который имел тип String
, а не Array[String]
, как я думаю, вы ожидали. Также вам нужно было trim
, чтобы справиться с пробелами во второй строке. Возможно, вы захотите также обрезать ключ и значение, чтобы избежать других проблем с пробелами.
Кроме того, в этом случае сочетание карты и фильтра можно сделать более кратко с помощью collect
, как показано здесь: Как преобразовать массив в кортеж? Использование шаблона с 2 элементами гарантирует, что вы отфильтруете все, что угодно, кроме длины 2. iterator
должен сделать комбинацию карты и сбора более эффективной, требуя только одну итерацию коллекции, возвращенной из первого split
(см. Комментарии ниже). Обе строки превращаются в карту, просто нужно правильно использовать groupBy
, чтобы сгруппировать первую карту по значению второй на основе того же ключа, чтобы получить то, что вы хотели. Очевидно, это работает только в том случае, если один и тот же ключ всегда находится на второй карте.
def toMap(str: String): Map[String, String] =
str
.split(";")
.iterator
.map(_.trim.split(','))
.collect { case Array(key, value) => (key.trim, value.trim) }
.toMap
val keyMap = toMap("androidApp,key1;iosApp,key2;xyz,key3")
val tentMap = toMap("androidApp,tenant1; iosApp,tenant1; xyz,tenant2")
val finalMap = keyMap.groupBy { case (k, _) => tentMap(k) }
Распечатка finalMap дает:
Map(tenant2 -> Map(xyz -> key3), tenant1 -> Map(androidApp -> key1, iosApp -> key2))
То, что вы хотели.