Как добавить список элементов в другой список по определенному индексу без удаления и замены каких-либо элементов - PullRequest
0 голосов
/ 07 мая 2020

Learning Scala Прямо сейчас, чтобы подготовиться к колледжу, я хочу добавить список в другой список по определенному индексу, не заменяя элементы в этом индексе. Например, если у меня есть начальный список:

var list1: List[Int] = List(1,2,3,4)

, я хочу добавить в него List(4,1,5), чтобы он стал:

var list1: List[Int] = List(1,2,4,1,5,3,4)

Изменить: я пробовал создать новые списки и добавление заголовка первого списка, списка, который я хочу добавить к первому, и хвоста первого списка, чтобы вернуть новый список.

Это то, что я сделал, но мне было интересно если бы были более эффективные и «умные» способы. Я провел небольшое исследование вставки, но я не уверен, удовлетворяет ли вставка то, что я пытаюсь сделать, поскольку я не совсем понимаю вставку.

Ответы [ 3 ]

2 голосов
/ 07 мая 2020
В коллекциях

Scala есть элемент patch, который может заменять или вставлять элементы:

var list1 = List(1,2,3,4)
list1.patch(2, List(4,1,5), 0)

Примечание: вставка элементов выполняется путем указания коллекции заменить 0 элементов.

2 голосов
/ 07 мая 2020

Ключевой частью обучения Scala является изучение стандартной библиотеки, которая имеет богатый набор классов и методов для обработки множества стандартных операций. В этом случае поможет метод splitAt коллекции:

var list1 = List(1, 2, 3, 4)
val list2 = List(4, 1, 5)

val (pre, post) = list1.splitAt(2)

pre ++ list2 ++ post

Это «умный» способ сделать это, потому что он ясно и просто показывает последовательность выполняемых операций, упрощение написания и сопровождения кода.

Обратите внимание, что это безопасно в случае, когда исходный список короче 2 элементов, потому что splitAt заботится об этом и просто возвращает исходный список в pre и оставляет post пустым.

0 голосов
/ 07 мая 2020
  def insertlistAtIndex(index : Int , original : List[Int], appendedList : List[Int]) : List[Int] = {
    original.
      zipWithIndex.flatMap{case (elem, ind) =>
        if(ind == index)
          appendedList :+ elem // append the element at that index
         //  appendedList ::: List(elem) more efficient solution (concatenation)
        else
          List(elem)
      }
  }

  val list1: List[Int] = List(1,2,3,4)
  val list2 : List[Int] = List(4,1,5)
  val expectedResult : List[Int] = List(1,2,4,1,5,3,4)
  val insertAtIndex = 2

  assert(insertlistAtIndex(insertAtIndex,list1,list2) == expectedResult )

Вот еще одно решение, оно более гибкое и функциональное, идея состоит в том, чтобы заархивировать список с его индексом, перемещаться по каждому элементу в списке, и когда вы дойдете до индекса, вы хотите поместить другой список , вы вставляете туда этот список, а также элемент, который изначально находился в этом элементе (показано двумя способами). Таким образом вы избегаете ненужных исключений, даже если предоставленный индекс выходит за пределы допустимого диапазона. Надеюсь, это поможет.

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