如何在scala中添加设置和增加计数器?

时间:2016-02-06 22:58:57

标签: scala

我想在集合中添加项目,如果项目中尚未存在。如果添加了项目,我想增加计数器并在结束时返回计数。 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
}

4 个答案:

答案 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

或者,只需使用fruitfruitsets的内容添加到++=,然后比较之前和之后的水果套装尺寸:

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