【发布时间】:2015-01-12 16:16:03
【问题描述】:
我正在处理这个 scala 代码:
case class M(a: String, b: Int)
val mm1 = List(Map("a" -> "001", "b" -> 12), Map("a" -> "002", "b" -> 25), Map("a" -> "003", "b" -> 100))
val mm2 = List(M("001", 12), M("004", 99), M("003", 100))
def validate(mm1: List[Map[String, Any]], mm2: List[M]): Boolean = {
for (m1 <- mm1) {
var found = false
val a = m1("a")
// nested loop: iterate mm2
breakable {
for (m2 <- mm2) {
if (a == m2.a) {
assert(m1("b") == m2.b)
found = true
break // if found just break
}
}
}
// All of elements in mm1 must exist in mm2.
// We will know this if "found" variable is set to true.
assert(found == true)
}
true
}
基本上validate 方法只是确保 mm1 中的所有值都存在于 mm2 中(基于“文本”键/属性),反之则没有必要。然后还要确保 mm1 和 mm2 的每个元素的属性值相等。
我正在尝试将validate 方法转换为函数式编程风格。但是不知道如何处理mm1中所有的检查项都应该在mm2中。
这是我尝试理解的内容:
def validate2(mm1: List[Map[String, Any]], mm2: List[M]): Boolean = {
for {
m1 <- mm1
a = m1("a")
m2 <- mm2
} {
if (a == m2.a) {
assert(m1("b") == m2.b)
}
}
true
}
不是很好,因为我不能将var found = false 放在 for 理解中。所以我无法检查 mm1 中的所有项目是否存在于 mm2 中。
任何人都可以提供帮助或有更好的想法(可能使用递归或根本不使用var found)?
【问题讨论】:
标签: scala functional-programming