val x = seq((1, 'a'), (2, 'b'))
val y = seq((1, 'AA'), (3, 'CC'), (4, 'DD'))
Ожидаемый результат
val z = seq((1, 'AA'), (2, 'b'))
Я могу сделать это, как показано ниже
x.toMap.map(k => (k._1, y.toMap.getOrElse(k._1, k._2))
Но это не сохранит порядок
Есть ли возможность сделать заказную замену
Вам необходимо уточнить некоторые ограничения и то, что вы пробовали и не сработало.
Предполагая, что вы хотите преобразовать x
за один проход, вы можете создать карту поиска из y
.
Способ создания Карты из того, что у вас есть:
val lookup: Map[Int, String] = {
val builder =
Map.newBuilder[Int, String]
for((key, value) <- y)
builder += (key -> value)
builder.result()
}
Затем используйте lookup
, чтобы преобразовать x
элементы, имеющие соответствие.
Во-первых, ваш код будет работать так же без первого toMap
, который не делает ничего полезного и разрушает порядок.
Во-вторых, вы конвертируете y
в Map
для каждого элемента x
, что делает это очень дорого и даже хуже, чем просто использование find
или collectFirst
.
В-третьих, мы могли бы использовать сопоставление с образцом, чтобы сделать код более читабельным.
// If you have a better name, feel free to change it.
def lookupOrPreserve[K, V](
input: Seq[(K, V)],
lookup: Map[K, V]
): Seq[(K, V)] =
input.map { case (key, originalValue) =>
key -> lookup.getOrElse(key, default = originalValue)
}
val x = seq((1 -> 'a'), (2 -> 'b'))
val y = seq((1 -> 'AA'), (3 -> 'CC'), (4 -> 'DD'))
val z = lookupOrPreserve(input = x, lookup = y.toMap)
Вы хотите заменить значения
x
на их поиск поy
или оставить их без изменений, если они не существуют, верно?