2016-02-15 7 views
3

В Scala у меня есть объект Array[Int] под названием elem.Удалить элемент по заданному индексу

Я хотел бы удалить элемент по индексу k.

Я попытался это:

elem.filter(! _.equals(elem(k))) 

Однако, это удаляет все элементы, которые равны elem(k).

Как я могу удалить только элемент по индексу k?

ответ

2
elem.zipWithIndex.filter(_._1 != k).map(_._2) 

Если у вас есть Array("a", "b", "c") то zipWithIndex - превращается в Array((0, "a"), (1, "b"), (2, "c"))

10

Для всех коллекций (вы можете просматривать Array как таковой), вы можете использовать непреложный patch метод, который возвращает новую коллекцию:

val xs = Seq(6, 5, 4, 3) 
// replace one element at index 2 by an empty seq: 
xs.patch(2, Nil, 1) // List(6, 5, 3) 

Если вы хотите изменить коллекцию, вы можете посмотреть на Buffer вместо Array.

val ys = collection.mutable.Buffer(6, 5, 4, 3) 
ys.remove(2) 
ys // ArrayBuffer(6, 5, 3) 
+0

Спасибо за наконечник буфера, вот что я искал – Nicofisi

3

Дополнительный способ достижения этой цели было бы путем принятия и капельной вокруг индекса:

val filteredElem = elem.take(k) ++ elem.drop(k+1) 
1

Использование splitAt следующим образом,

val (l,r) = xs.splitAt(k) 
l ++ r.drop(1) 

Также аналогичным образом с использованием zipWithIndex , мы генерируем диапазон индексов и отфильтровываем их со значением k, затем мы можем извлечь остальные, например,

(0 until xs.size).filter(_ != k).map(xs) 

Использование collect,

(0 until xs.size).collect { 
    case x if x != k => xs(x) 
} 

Использование для понимания,

for (i <- 0 until xs.size if i != k) yield xs(i) 

Более общая форма, в которой у нас есть множество индексов, чтобы исключить, а именно для

val exclude = Set(k,k+3) 
for (i <- 0 until xs.size if !exclude(i)) yield xs(i) 

мы отображаем индексы не в exclude.

Смежные вопросы