输入Scala中的分区不匹配(预期(Set [String] ...),actual(Set [String] ...))

时间:2014-07-01 16:00:24

标签: scala collections

我有一个分区方法,可以创建两组字符串的元组。

  def partition(i:Int) = {
    dictionary.keySet.partition(dictionary(_)(i) == true)
  }

我还有一个映射,它将整数映射到分区方法的返回值。

val m = Map[Int, (Set[String], Set[String])]()
for (i <- Range(0, getMaxIndex())) {
  m(i) = partition(i)
}

问题是我有类型不匹配错误,但错误消息对我没有意义。

enter image description here

可能出现什么问题?

这是代码:

import scala.collection.mutable.Map
import scala.collection.{BitSet}

case class Partition(dictionary:Map[String, BitSet]) {
  def max(x:Int, y:Int) = if (x > y) x else y
  def partition(i:Int) = {
    dictionary.keySet.partition(dictionary(_)(i) == true)
  }
  def getMaxIndex() = {
    val values = dictionary.values
    (0 /: values) ((m, bs) => max(m, bs.last))
  }
  def get() = {
    val m = Map[Int, (Set[String], Set[String])]()
    for (i <- Range(0, getMaxIndex())) {
      m(i) = partition(i)
    }
    m
  }
}

1 个答案:

答案 0 :(得分:1)

编译示例时,错误很明显:

<console>:64: error: type mismatch;
 found   : (scala.collection.Set[String], scala.collection.Set[String])
 required: (scala.collection.immutable.Set[String], scala.collection.immutable.Set[String])
             m(i) = partition(i)
                             ^

查看API,可变映射的keySet方法不保证返回的集合是不可变的。将此与keySet在不可变映射上进行比较 - 它确实确实返回一个不可变集。

因此,您可以

  • 使用不可变Mapvar
  • 强制partition方法的结果返回不可变集(例如toSet
  • 将地图的值类型定义为collection.Set,而不是Predef.Setcollection.immtuable.Set的别名。

为了澄清这些类型,有助于为公共方法指定显式返回类型(getpartition