将 Scala 列表的每个元素与列表中的其余元素进行比较
Compare each element of Scala list against rest of elements in the list
我有一个自定义对象列表,将与同一列表中的其余对象进行比较。
我目前的方法:目前我使用 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.
}
}
有没有其他有效的方法可以在同一个列表中的 Scala 中执行此迭代而无需两个 foreach 循环?
一种将集合中的每个元素与其余元素进行比较并收集相似的方法(此处相同,在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
中的 ==
替换为 dissimilarity 函数,用于比较项目以确定哪些足够相似。
您尝试过使用 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
就其价值而言,enzymes solution 更符合 scala 所支持的函数式风格。
我有一个自定义对象列表,将与同一列表中的其余对象进行比较。
我目前的方法:目前我使用 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.
}
}
有没有其他有效的方法可以在同一个列表中的 Scala 中执行此迭代而无需两个 foreach 循环?
一种将集合中的每个元素与其余元素进行比较并收集相似的方法(此处相同,在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
中的 ==
替换为 dissimilarity 函数,用于比较项目以确定哪些足够相似。
您尝试过使用 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
就其价值而言,enzymes solution 更符合 scala 所支持的函数式风格。