如何在Scala ListBuffer中查找和删除元素?

时间:2018-11-18 01:14:57

标签: java scala collections iterator

以下代码在Scala 2.12.7和Java 11.0.1中引发my_list.sort(key=lambda tup: tup[0].lower())

UnsupportedOperationException

为什么? listBuffer .iterator .dropWhile(_ != u) .asJava .remove() 是可变的,并且在遍历时使用ListBuffer删除元素应该是有效的。 Iterator包含ListBuffer

Int

编辑: 不是this问题的重复项,因为与此相关的问题是试图从结构上修改java.lang.UnsupportedOperationException was thrown. java.lang.UnsupportedOperationException at scala.collection.convert.Wrappers$IteratorWrapper.remove(Wrappers.scala:31) at scala.collection.convert.Wrappers$IteratorWrapper.remove(Wrappers.scala:26) at week4.UndirectedGraph.$anonfun$removeVertex$2(UndirectedGraph.scala:52) at scala.runtime.java8.JFunction1$mcVI$sp.apply(JFunction1$mcVI$sp.java:12) at scala.collection.immutable.List.foreach(List.scala:388) at scala.collection.generic.TraversableForwarder.foreach(TraversableForwarder.scala:34) at scala.collection.generic.TraversableForwarder.foreach$(TraversableForwarder.scala:34) at scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:43) at week4.UndirectedGraph.$anonfun$removeVertex$1(UndirectedGraph.scala:50) 返回的列表。如果不是不知道答案的人,但我通常不必第一个尝试重复回答一个问题。

2 个答案:

答案 0 :(得分:1)

以下是引发错误的source代码:

 case class IteratorWrapper[A](underlying: Iterator[A]) extends ju.Iterator[A] with ju.Enumeration[A] {
    def hasNext = underlying.hasNext
    def next() = underlying.next()
    def hasMoreElements = underlying.hasNext
    def nextElement() = underlying.next()
    override def remove() = throw new UnsupportedOperationException
  }

请注意,它并不关心基础集合是否可变。

我认为这种实现是有道理的。 Scala迭代器在设计上不支持remove();将它们转换为Java也应产生行为相同的迭代器。

答案 1 :(得分:-1)

不是您问题的直接答案,而是一个解决方案,以防万一您只需要根据对象相等性删除元素,就像示例代码中一样:

使用-=中的ListBuffer方法。这样会从ListBuffer中删除所有出现的元素,而不会创建该结构的副本。

  def main(args: Array[String]): Unit = {
    val u = 999
    val listBuffer = new ListBuffer[Int]
    listBuffer ++= Seq(1, 7, 3, 8, 0, 3, 6, 7, 999, 5, 7, 8, 999, 1, 5, 999)
    println(listBuffer)
    listBuffer -= u
    println(listBuffer)
  }

如果您使用filter方法,则可以使用谓词,但是会创建ListBuffer的副本:

  def main(args: Array[String]): Unit = {
    val u = 999
    var listBuffer = new ListBuffer[Int]
    listBuffer ++= Seq(1, 7, 3, 8, 0, 3, 6, 7, 999, 5, 7, 8, 999, 1, 5, 999)
    println(listBuffer)
    listBuffer = listBuffer.filter(_ != u)
    println(listBuffer)
  }