Scala: удаление элементов из вектора

#scala #apache-spark

#scala #apache-spark

Вопрос:

У меня есть вектор, и я хочу удалить элементы из вектора. Как я могу это сделать в Scala?Мой ввод — это вектор[2.0, 3.0, 0.3, 1.0, 4.0] —> Vector[Double] и я хочу, чтобы на выходе был вектор [2.0, 0.3, 4.0], поэтому я хочу удалить элемент с индексом 1 и 3 из моего входного вектора…

 def removeElementFromVector(input: Vector) = {   
  val inputAsArray = input.toArray

  inputAsArray

  // ...
  val reducedInputAsVector = inputAsArray.toVector 
}
  

Комментарии:

1. Просто для ясности, когда вы говорите, что хотите удалить элемент, как это конкретно происходит? Можете ли вы привести пример ввода и вывода о том, что вы ищете?

Ответ №1:

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

Пример: ваш вектор (scala.collection.immutable.Вектор [Двойной]):

 scala> val v1 = val v1 = Vector(2.2, 3.3, 4.4, 5.5, 6.6, 4.4)

Output: Vector(2.2, 3.3, 4.4, 5.5, 6.6, 4.4)
  

Теперь мы удалим элемент с индексом 2:

 scala> var indexRemove=2

scala> val v2 = v1.zipWithIndex.filter(x => x._2!=indexRemove).map(x=>x._1).toVector
Output: Vector(2.2, 3.3, 5.5, 6.6, 4.4)
  

Теперь мы удалим элемент с индексом 3

 scala> var indexRemove=3
scala> val v2 = v1.zipWithIndex.filter(x => x._2!=indexRemove).map(x=>x._1).toVector
Output: Vector(2.2, 3.3, 4.4, 6.6, 4.4)
  

Надеюсь, это поможет.

Комментарии:

1. Спасибо, но это не работает, возможно, потому, что я использую » org.apache.spark.mllib.linalg. Вектор »

2. Это не приведет к удалению объекта с индексом 2, оно удалит все объекты, равные объекту с индексом 2. (indexOf даст индекс первой вещи, равный x) Вы могли бы выполнить v1.diff List(v1 (N)), чтобы удалить только один экземплярN-го элемента. Если вы хотите специально удалить N-й элемент, вам нужно выполнить v1.slice(0, N) v1.slice(N 1, v1.size). Или v1.zip (от 0 до v1.размер). filterNot( ._2 == N).map( ._1).

Ответ №2:

Мой ввод: Вектор[2.0, 3.0, 0.3, 1.0, 4.0] —> Vector[Double] и я хочу, чтобы на выходе был вектор [2.0, 3.0, 0.3, 4.0], поэтому я хочу удалить элемент с индексом 1 и 3 из моего входного вектора. Ответ на мой вопрос был недостаточно ясен..

Ответ №3:

Вы можете использовать filter метод для их удаления.

 > val reducedInputVector = input.filter(x => !(Array(1,3) contains input.indexOf(x)))
reducedInputVector: scala.collection.immutable.Vector[Double] = Vector(2.0, 0.3, 4.0)
  

Комментарии:

1. Этот ответ неверен и не имеет смысла. Не могли бы вы просмотреть его, пожалуйста?

2. @eliasah Теперь я обновил код. Не могли бы вы проверить, все ли в порядке? Я не понял, почему это было неправильно. Это потому, что я был слишком тупым?

Ответ №4:

Я решил это с помощью apply:

 val vec1 = Vector(2.0,3.0,0.3,1.0, 4.0)
val vec2 = Vectors.dense(vec1.apply(0), vec1.apply(1),vec1.apply(2), vec1.apply(4))
  

вывод

 vec1: scala.collection.immutable.Vector[Double] = Vector(2.0, 3.0, 0.3, 1.0, 4.0)
vec2: org.apache.spark.mllib.linalg.Vector = [2.0,3.0,0.3,4.0]
  

Комментарии:

1. Vectors.dense не является частью стандартной библиотеки Scala, vec2 имеет другой тип данных, чем vec1. Кроме того, запись vec1.apply(0) излишне подробна, поскольку вы можете просто писать vec1(0) .

2. В своем вопросе и комментариях вы неоднократно заявляли, что хотите «удалить элемент с индексом 1 и 3», но то, что вы сделали, — это удалить только элемент с индексом 3 очень неэффективным способом. Ваш вопрос и ваше решение не имеют смысла. Если бы у вас Vector было 247 элементов, и вы хотели удалить тот, который находится с индексом 9, так ли вы бы это сделали?

3. мой ввод представляет собой вектор типа «org.apache.spark.mllib.linalg. Вектор».

Ответ №5:

 def deleteItem[A](row: Vector[A], item: Int): Vector[A] = {
  val (a,b) = row.splitAt(item)
  if (b!=Nil) a    b.tail else a
}