从配对列表中删除

时间:2012-11-06 06:56:24

标签: scala

我有一个从列表y中删除一个列表x的函数。前提条件是事件列表yx的子集 - y中出现的任何字符都必须出现在x中,其频率必须在y中be< = x中的频率。

结果值是一个事件 - 意味着它已排序且没有零条目。

这是我的原始代码。这是针对Scala progfun的任务,现在我只是对正确的答案感到好奇。

type Occurrences = List[(Char, Int)]

def subtract(x: Occurrences, y: Occurrences): Occurrences = x filterNot (y contains)

必须通过以下单元测试。

测试1

 test("subtract: lard - r") {
    val lard = List(('a', 1), ('d', 1), ('l', 1), ('r', 1))
    val r = List(('r', 1))
    val lad = List(('a', 1), ('d', 1), ('l', 1))
    assert(subtract(lard, r) === lad)
  }

测试2

// subtract: jimmy - my
List((i,1), (j,1), (m,1), (y,0)) did not equal List((i,1), (j,1), (m,1))

测试3

//subtract: ok - ok
List((k,0), (o,0)) did not equal List()

测试4

//subtract: abba - abba
List((a,0), (b,0)) did not equal List()

测试5

//subtract: assessment - assess

2 个答案:

答案 0 :(得分:0)

如果你想要剥离左边的元素与y的任何元素的左边相等,下面的代码就是这样。

def subtract(x: Occurrences, y: Occurrences): Occurrences = 
  x filterNot (y.map(_._1) contains _._1)

答案 1 :(得分:0)

如果我正确理解了作业,则需要减去计数。我的尝试将是这样的:

def subtract(x: Occurrences, y: Occurrences): Occurrences = {
  val my = y.toMap
  x.map(occ => (occ._1, occ._2 - (my.get(occ._1) getOrElse 0) ))
   .filter(_._2 > 0)
}