我有以下Scala代码,其中z表示字符串数组,每个字符串表示数据集的数据点。
第一步是计算数据集中第一个字符串与数据集中所有其他字符串之间的匹配分数,之后将所有相似的字符串存储在一个集合中。
第二步是计算第一个步骤中第二个字符串与数据集中所有其他不匹配字符串不匹配的匹配分数。
第三步和随后的步骤与前面的步骤相同。
最重要的是我必须注意上述过程中匹配的所有字符串都不会参与其他循环,因为它们已在前面的步骤中匹配。
建议对代码进行更改,以满足上述所有要求。
val z = y.split("\n") // z is Array[String]
for (i <- 1 to 500)
{
var str = ArrayBuffer[String]()
str += z(i)
for(j <- 1 to 500)
{
val dist = match(z(i),z(j)) // match calculates score between 2 strings
if (dist < threshold){
str += z(j)
}
}
答案 0 :(得分:2)
可以传达预期语义的Scalish方法,例如
val xs = y.split("\n")
val res =
for { zi <- xs
zj <- xs
if score(zi,zj) < threshold
}
yield zj
res.mkString
即,对于splat字符串中的每个zi
和每个zj
,过滤那些评分小于threshold
的对,然后从每对中产生第二项。< / p>
请注意,这不需要索引引用或可变集合。