有没有办法有效地做到这一点,也许通过toBuffer或方法?我真正的问题是我正在构建一个解析器列表,如下所示:
lazy val nodes: Parser[List[Node]] = phrase(( nodeA | nodeB | nodeC).*)
Run Code Online (Sandbox Code Playgroud)
但是在构建它之后,我希望它成为缓冲区 - 我只是不确定如何直接从解析器构建缓冲区.
我有一个ListBuffer.我想删除所有符合特定条件的元素.
我可以迭代它并删除每个元素.但是,Scala如何改变你正在迭代的列表呢?它会工作,还是会删除错误的元素/不返回所有元素?(使用REPL的快速尝试表明是的,它会搞砸)
我可以反复调用find然后删除找到的元素,直到我找不到为止,但这听起来效率低下.
.filter将返回一个没有元素的新ListBuffer,但我想在适当的位置进行.
这个
def --= (xs: TraversableOnce[A]) : ListBuffer.this.type
Removes all elements produced by an iterator from this list buffer.
Run Code Online (Sandbox Code Playgroud)
看起来很有希望,但我不知道如何在这里使用它
我该怎么做?
创建空ListBuffer的最有效方法是什么?
val l1 = new mutable.ListBuffer[String]
val l2 = mutable.ListBuffer[String] ()
val l3 = mutable.ListBuffer.empty[String]
有什么优点和缺点有区别吗?
我有问题将对象附加到scala.collection.mutable.ListBuffer.我熟悉相应的API,并且知道通常使用+ =或++ =方法添加对象或对象序列.
我正在实施一个网络支持的纸牌游戏,并且有一个简单的问题,即将一些选择的卡添加到手牌列表中.在下面的代码中,我将获得对手册列表(ListBuffer)的引用,打印ListBuffer的大小,将选定的卡添加到其中并再次打印大小.
// get the references and ensure that it are rally ListBuffers / Lists
val handCards: mutable.ListBuffer[ClientCard] = playerPanel.player.handCards
val chosenCards: List[ClientCard] = _chosenCards
// print the number of elements per list
println("number of hand cards: " + handCards.size)
println("number of chosen cards: " + chosenCards.size)
// append the chosen cards to the hand cards
println("append operation: " + handCards + " ++= " + chosenCards)
handCards ++= chosenCards
// print …
Run Code Online (Sandbox Code Playgroud) 我在下面使用Stream和lazy val编写了以下懒惰筛选算法的实现:
def primes(): Stream[Int] = {
lazy val ps = 2 #:: sieve(3)
def sieve(p: Int): Stream[Int] = {
p #:: sieve(
Stream.from(p + 2, 2).
find(i=> ps.takeWhile(j => j * j <= i).
forall(i % _ > 0)).get)
}
ps
}
Run Code Online (Sandbox Code Playgroud)
以及使用(mutable)ListBuffer的以下实现:
import scala.collection.mutable.ListBuffer
def primes(): Stream[Int] = {
def sieve(p: Int, ps: ListBuffer[Int]): Stream[Int] = {
p #:: { val nextprime =
Stream.from(p + 2, 2).
find(i=> ps.takeWhile(j => j * j <= i).
forall(i % _ …
Run Code Online (Sandbox Code Playgroud) 在scala中,为什么toSet()
方法会混淆collection(ListBuffer
)中元素的顺序?
我可以使用哪个集合来确保每个元素的唯一性并保持其原始顺序?
如果可能,我将如何从java中循环ListBuffer.ListBuffer的初始化(在scala中)
var newModVersions: ListBuffer[NewModVersionEntry] = new ListBuffer[NewModVersionEntry]()
Run Code Online (Sandbox Code Playgroud)
当前智能for循环(在java中)
for (VersionCheckHandler.NewModVersionEntry entry : XplosionCoreBL.newModVersions())
Run Code Online (Sandbox Code Playgroud) 我有一些从simple读取的值Text file
。
这是我的数据:
val data = new ListBuffer[(String, BigDecimal)]
Run Code Online (Sandbox Code Playgroud)
现在,我想在我的项目内添加项目ListBuffer
:
data += ("bla bla", 12)
Run Code Online (Sandbox Code Playgroud)
然后收到错误:
类型不匹配; 找到:List [(String,scala.math.BigDecimal)]必需:(String,BigDecimal)数据+ = List((“ bla bla”,12))
所以我有这个2 collections
:
import collection.mutable.ListBuffer
val list1 = ListBuffer[(String, String)]()
list1 += (("Italy", "valid"))
list1 += (("Germany", "not valid"))
list1 += (("USA", "not valid"))
list1 += (("Romania", "valid"))
val list2 = ListBuffer[String]()
list2 += "Germany"
list2 += "USA"
list2 += "Romania"
list2 += "Italy"
list2 += "France"
list2 += "Croatia"
Run Code Online (Sandbox Code Playgroud)
我想得到包含具体的公共国家的新列表,condition
例如valid
结果将是新列表:
Italy, Romania
Run Code Online (Sandbox Code Playgroud) 我希望ListBuffer(Int, Int, Int)
最有效地排序第三个值.这就是我现在拥有的.我在用sortBy
.请注意y
并且z
两者都是ListBuffer[(Int, Int, Int)]
,我先区别对待.我的目标是优化它并最有效地执行此操作(取两个列表之间的差异并按第三个元素排序).我假设diff
部件无法优化但sortBy可以,所以我正在寻找一种有效的方法来做分拣部分.我找到了关于排序数组的帖子,但我正在使用ListBuffer并转换为数组会增加开销,所以我宁愿不转换我的ListBuffer.
val x = (y diff z).sortBy(i => i._3)
Run Code Online (Sandbox Code Playgroud) listbuffer ×10
scala ×10
collections ×2
list ×2
append ×1
java ×1
scala-2.8 ×1
set ×1
sorting ×1
stream ×1