Ответ 1
Просто используйте
val trunced = internalIdList.take(index) ++ internalIdList.drop(index + 1)
Это также будет работать, если индекс больше размера списка (он вернет тот же список).
У меня есть список:
val internalIdList: List[Int] = List()
internalIdList = List(11, 12, 13, 14, 15)
Из этого списка можно удалить третий элемент, чтобы получить:
internalIdList = List(11, 12, 14, 15)
Я не могу использовать ListBuffer
, обязаны поддерживать существующую структуру.
Как я могу сделать?
Спасибо всем
Просто используйте
val trunced = internalIdList.take(index) ++ internalIdList.drop(index + 1)
Это также будет работать, если индекс больше размера списка (он вернет тот же список).
В Seq
есть метод .patch
, поэтому для удаления третьего элемента вы можете просто сделать это:
List(11, 12, 13, 14, 15).patch(2, Nil, 1)
Что говорит: Начиная с индекса 2, удалите 1 элемент и замените его на ноль.
Знание этого метода в глубине позволяет вам сделать гораздо больше, чем это. Вы можете поменять любой подсписок списка произвольным другим.
Идиоматический способ сделать это - закрепить значение своим индексом, фильтром, а затем запрогнозировать значение снова:
scala> List(11,12,13,14,15).zipWithIndex.filter(_._2 != 2).map(_._1)
res0: List[Int] = List(11, 12, 14, 15)
Но вы также можете использовать splitAt
:
scala> val (x,y) = List(11,12,13,14,15).splitAt(2)
x: List[Int] = List(11, 12)
y: List[Int] = List(13, 14, 15)
scala> x ++ y.tail
res5: List[Int] = List(11, 12, 14, 15)
Если вы настаиваете на использовании метода oldschool, используйте команду collect:
List(1,2,3,4).zipWithIndex.collect { case (a, i) if i != 2 => a }
Тем не менее, я по-прежнему предпочитаю метод в другом ответе.
(internalIdList.indices.collect { case i if i != 3 => internalList(i) }).toList
Чтобы обобщить это...
def removeIndex[A](s: Seq[A], n: Int): Seq[A] = s.indices.collect { case i if i != n => s(i) }
Хотя это часто возвращает вектор, поэтому вам нужно будет сделать
val otherList = removeIndex(internalIdList, 3).toList
Если вам действительно нужен список.
У Shadowlands есть решение, которое имеет тенденцию быть более быстрым для линейных последовательностей. Это будет быстрее с индексированными последовательностями.
Общая функция, реализующая первое решение Николаса:
def dropIndex[T](list: List[T], idx: Int): List[T] =
list.zipWithIndex.filter(_._2 != idx).map(_._1)
Использование:
scala> val letters = List('a', 'b', 'c')
scala> for (i <- 0 until letters.length) println(dropIndex(letters, i))
List(b, c)
List(a, c)
List(a, b)
Используя для понимания для списка xs
, как это,
for (i <- 0 until xs.size if i != nth-1) yield xs(i)
Также рассмотрим набор индексов исключения, например val excl = Set(2,4)
для исключения второго и четвертого элементов; поэтому мы собираем те элементы, индексы которых не принадлежат к набору исключений, а именно
for (i <- 0 until xs.size if !excl(i)) yield xs(i)