将Scala列表的每个元素与列表中的其余元素进行比较

时间:2015-02-03 09:59:59

标签: list scala foreach scala-collections

我有一个Custom对象列表,它将与同一列表中的其他对象进行比较。

我当前的方法:目前我使用foreach循环从列表中获取一个元素,运行另一个foreach循环以查看列表中与被摄对象类似的元素。

case class TestOb(name:String,pos:Vector[Int])

val lis:List[TestOb] = null

lis.foreach{i=>
    val ref = i._2
    lis.foreach{j=>
        val current = j._2
        //compare ref and current.
    }
}

在没有两个foreach循环的情况下,是否有任何其他有效的方法可以在同一列表中的Scala中执行此迭代?

2 个答案:

答案 0 :(得分:5)

您是否尝试过使用for - 循环?

for( a <- lis; b <- lis) {
  // do stuff with a and b
}

为了进一步方便,这里有一个简单的例子来了解幕后的迭代:

scala> val list = 1 to 3
list: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)
scala> for(a <- list; b <- list) println(a+" - "+b)
1 - 1
1 - 2
1 - 3
2 - 1
2 - 2
2 - 3
3 - 1
3 - 2
3 - 3

为了它的价值,酶解决方案将更符合功能风格的scala包容。

答案 1 :(得分:2)

将一个集合中的每个元素与其余元素进行比较并收集相似的元素的方法(此处==中使用collect相同)。为了说明这种情况,请考虑

case class C(i:Int)

以及C(1)具有similar项目(此处相等)的集合,

val xs = Array( C(1),C(2),C(3),C(1),C(4) )

因此,我们将每两项合并,比较它们并收集相似的项目,

xs.combinations(2).collect { case Array(a,b) if a == b => a }.toArray
Array(C(1))

注意combinations提供一个由collect消耗(迭代)的迭代器。另外,将==中的collect替换为相异函数,以便比较项目以确定哪些内容足够相似。