Обновить c индексы Seq другим Seq в Scala - PullRequest
1 голос
/ 14 февраля 2020

У меня есть первый seq, например:

val s: Seq[Double] = List.fill(6)(0.0)

и подпоследовательности индексов s:

val subInd: Seq[Int] = List(2, 4, 5)

Теперь, что я хочу сделать, это обновить s на позициях 2, 4 и 5 другим Seq, который имеет длину subInd:

val t: Seq[Double] = List(5.0, 6.0, 7.0)

такой, что:

val updateBySeq(s, subInd, t): List[Double] = List(0.0, 0.0, 5.0, 0.0, 6.0, 7.0)

Я искал на этом сайте и нашел Обновите несколько значений в последовательности , где второй ответ приближается к функциональности, которую я хочу иметь.

Однако, разница в том, что предоставленная функция обновит s по индексам, содержащимся в subInd на один значение. Я, с другой стороны, хотел бы, чтобы они соответствовали множеству уникальных значений в третьей последовательности.

Я пробовал разные вещи, такие как использование рекурсии и ListBuffers вместо списков для постепенного обновления элементов из s, но либо они оставили s без изменений, либо я получил ошибку, потому что нарушил какое-то ограничение неизменности.

1 Ответ

4 голосов
/ 14 февраля 2020

Это должно работать:

def updateListByIndexes[T](data: List[T])(indexes: List[Int], update: List[T]): List[T] = {
  val updateMap = (indexes lazyZip update).toMap

  data.iterator.zipWithIndex.map {
    case (elem, idx) =>
      updateMap.getOrElse(key = idx, default = elem)
  }.toList
}

Что вы можете использовать так:

val s = List.fill(6)(0.0)
// s: List[Double] = List(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)

val subInd = List(2, 4, 5)
// subInd: List[Int] = List(2, 4, 5)

val t = List(5.0, 6.0, 7.0)
// t: List[Double] = List(5.0, 6.0, 7.0)

updateListByIndexes(s)(subInd, t)
// res: List[Double] = List(0.0, 0.0, 5.0, 0.0, 6.0, 7.0)
...