我想在集合中添加项目,如果项目中尚未存在。如果添加了项目,我想增加计数器并在结束时返回计数。 scala的做法是什么?
这是我到目前为止所拥有的。
var fruitSets: Set[String] = Set()
def addToSetAndSum(): Int = {
var counter = 0
val fruit: List[String] = List("apples", "oranges", "pears", "apples", "apples")
for (f in fruit) {
if (!fruitSets.contains(f)) {
fruitSets += f
count += 1
}
}
counter
}
答案 0 :(得分:3)
您可以使用fruit
计算fruitSets
中不在fruit.toSet -- fruitSets
内的项目集,允许您按如下方式重写代码:
var fruitSets: Set[String] = Set()
def addToSetAndSum(): Int = {
val fruit: List[String] = List("apples", "oranges", "pears", "apples", "apples")
val newFruit = fruit.toSet -- fruitSets
fruitSets ++= newFruit
newFruit.size
或者,只需使用fruit
将fruitsets
的内容添加到++=
,然后比较之前和之后的水果套装尺寸:
def addToSetAndSum(): Int = {
val fruit: List[String] = List("apples", "oranges", "pears", "apples", "apples")
val initialSize = fruitSets.size
fruitSets ++= fruit
fruitSets.size - initialSize
答案 1 :(得分:0)
在这种情况下,我不认为Set是更合适的结构,因为你想在最后存储计数器。
我的解决方案:
val fruits = List("apples", "oranges", "pears", "apples", "apples")
val result = fruits.groupBy(identity).mapValues(_.length)
结果是:
scala.collection.immutable.Map[String,Int] = Map(oranges -> 1, pears -> 1, apples -> 3)
通过这种方式,您可以获得带水果的地图和相应的计数器。
答案 2 :(得分:0)
我不希望您在Scala代码中使用任何可变集合或变量。所以检查一下,只需使用尾递归即可。
object Test extends App{
def addToSetAndSum(set: Set[String], items: List[String], count: Int): (Set[String], Int) = {
items match {
case Nil => (set,count)
case x :: xs if(!set.contains(x)) => addToSetAndSum(set+x, xs, count+1)
case x :: xs => (set, count)
}
}
val set = Set.empty[String]
val fruits = List("apples", "oranges", "pears", "apples", "apples")
val result = addToSetAndSum(set,fruits,0)
println(result._1, result._2)
}
您甚至可以使用案例类而不是元组来提高代码可读性。
答案 3 :(得分:0)
一个干净的Scalaish解决方案在它下面有一个var(不推荐),但是为了有某种持久性,我将在这次使用。
case class Items[T](var items: Set[T]) {
def addItemsToSet(item: T): Int = {
if(!items(item)) items = items + item
items.size
}
}
defined class Items
scala> val i = new Items(Set.empty[Int])
i: Items[Int] = Items(Set())
scala> i.addItemsToSet(1)
res0: Int = 1
scala> i.addItemsToSet(2)
res1: Int = 2
scala> i.addItemsToSet(3)
res2: Int = 3
scala> i.addItemsToSet(3)
res3: Int = 3