以下代码在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)
返回的列表。如果不是不知道答案的人,但我通常不必第一个尝试重复回答一个问题。
答案 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)
}