web-dev-qa-db-ja.com

Scalaインデックスのみを持つリスト)からアイテムを削除する方法は?

次のようなリストがあります。

val internalIdList: List[Int] = List()

internalIdList = List(11, 12, 13, 14, 15)

このリストから、取得するために3番目の要素を削除します。

internalIdList = List(11, 12, 14, 15)

ListBufferは使用できません。既存の構造を維持する義務があります。どのようにできるのか?

ありがとうございます

18
YoBre

単に使う

val trunced = internalIdList.take(index) ++ internalIdList.drop(index + 1)

これは、インデックスがリストのサイズより大きい場合にも機能します(同じリストを返します)。

18
Shadowlands

.patchメソッドをSeqで実行するため、3番目の要素を削除するには、次のようにします。

List(11, 12, 13, 14, 15).patch(2, Nil, 1)

どちらが言う:インデックス2から始めて、1要素を削除して、それをNilに置き換えてください。

この方法を深く理解することで、それ以上のことが可能になります。リストの任意のサブリストを任意の他のものと入れ替えることができます。

46
Rok Kralj

それを行う慣用的な方法は、インデックスを使用して値を圧縮し、フィルター処理してから、値を再度投影することです。

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)
11
Nicolas

Oldschoolメソッドの使用を主張する場合は、collectを使用します。

List(1,2,3,4).zipWithIndex.collect { case (a, i) if i != 2 => a }

しかし、私はまだ他の答えでメソッドを好みます。

3
Rok Kralj

Nicolasの最初のソリューションを実装する汎用関数:

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)
1
simleo
(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には、線形シーケンスに対してtendsが高速になるソリューションがあります。これは、インデックス付けされたシーケンスで高速になります。

1
itsbruce

このように_xsをリストで理解するために使用すると、

_for (i <- 0 until xs.size if i != nth-1) yield xs(i)
_

また、2番目と4番目の項目を除外するためのval excl = Set(2,4)などの一連の除外インデックスについても検討してください。したがって、インデックスが除外セットに属していないアイテム、つまり

_for (i <- 0 until xs.size if !excl(i)) yield xs(i)
_
0
elm