Scala:哈希集交集
Scala: HashSet Intersection
我有 2000 多行 (ID1 ID2),每行由文本文件中的空白 space 分隔。 ID1&2 的大小都是 100.
//My load file codes
def loadFile(file:Iterator[String]):Set[(Int,Int)] = {
val z1 = file.map(line =>line.split(" ") match {
case Array(id1,id2)=>(id1.toInt,id2.toInt)
}).toSet
z1
}
我将它们加载为 Set(Tuples(ID1, ID2))
。由于我的集合超过4个元素,所以这里表示为一个HashSet。
myData = HashSet((15,88), (56,66), (92,68), (27,4), (84,14), (88,17), (6,47), (97,45), (96,41), (21,66), (65,10), (44,66), (2,9), (86,61),...)
我的代码的目标是在每个 ID1 中找到 哪个 ID2 具有 involved/contains/intersected。最后,打印出ID2
,即(ID1_1,ID2_EVERYONE),(ID1_2,ID2_EVERYONE), (ID1_3,ID2_EVERYONE), (ID1_4,ID_EVERYONE), ... ,(ID1_100,ID2_EVERYONE)
print ID_EVERYONE
已更新
这里给出我的示例的较小组大小,对于 size= 5,
(1,5), (2,5), (3,5),(4,5),(5,5),
(1,4), (2,4), (3,4),(4,4),(5,4),
(5,4), (4,5)
对于条件:ID_1(从1到5)他们都认识4和5。而ID_1= 4&5只允许互相认识。最后打印出ID 4&5.
已更新 V2
(37,52), (37,37), (37,45), (37,14)
(52,37), (52,52), (52,45), (52,14)
(14,20), (14,14), (14,12), (14,4), (14,49), (14,91), (14,45), (14,54), (14,52), (14,37)
(45,45), (45,52), (45,14), (45,37)
来自@jwvh 的代码:
myData.groupMap(_.1)(._2).values.reduce( _ intersect _)
生成上面的数据很有帮助。然而,观察 ID14 知道除了 ID 37,52,45 和它自己 之外的额外 ID。因此,ID14 也应该被过滤掉。
如果我理解正确,您希望找到所有 ID1 成员 "known" 但不将任何其他 ID2 成员识别为 ID1 成员的 ID2 子集
你能试试那样吗
val id1Pointers : Map[Int,Set[Int]] = myData.groupBy(_._1).mapValues(_.map(_._2).toSet)
val id2Optionals: Set[Int] = id1Pointers.values.reduce( _ intersect _)
val finalId2 = id2Optionals.filter(id2 => (id1Pointers.getOrElse(id2,Set[Int]()).subsetOf(id2Optionals)))
println(finalId2.mkString("&"))
我有 2000 多行 (ID1 ID2),每行由文本文件中的空白 space 分隔。 ID1&2 的大小都是 100.
//My load file codes
def loadFile(file:Iterator[String]):Set[(Int,Int)] = {
val z1 = file.map(line =>line.split(" ") match {
case Array(id1,id2)=>(id1.toInt,id2.toInt)
}).toSet
z1
}
我将它们加载为 Set(Tuples(ID1, ID2))
。由于我的集合超过4个元素,所以这里表示为一个HashSet。
myData = HashSet((15,88), (56,66), (92,68), (27,4), (84,14), (88,17), (6,47), (97,45), (96,41), (21,66), (65,10), (44,66), (2,9), (86,61),...)
我的代码的目标是在每个 ID1 中找到 哪个 ID2 具有 involved/contains/intersected。最后,打印出ID2
,即(ID1_1,ID2_EVERYONE),(ID1_2,ID2_EVERYONE), (ID1_3,ID2_EVERYONE), (ID1_4,ID_EVERYONE), ... ,(ID1_100,ID2_EVERYONE)
print ID_EVERYONE
已更新 这里给出我的示例的较小组大小,对于 size= 5,
(1,5), (2,5), (3,5),(4,5),(5,5),
(1,4), (2,4), (3,4),(4,4),(5,4),
(5,4), (4,5)
对于条件:ID_1(从1到5)他们都认识4和5。而ID_1= 4&5只允许互相认识。最后打印出ID 4&5.
已更新 V2
(37,52), (37,37), (37,45), (37,14)
(52,37), (52,52), (52,45), (52,14)
(14,20), (14,14), (14,12), (14,4), (14,49), (14,91), (14,45), (14,54), (14,52), (14,37)
(45,45), (45,52), (45,14), (45,37)
来自@jwvh 的代码:
myData.groupMap(_.1)(._2).values.reduce( _ intersect _)
生成上面的数据很有帮助。然而,观察 ID14 知道除了 ID 37,52,45 和它自己 之外的额外 ID。因此,ID14 也应该被过滤掉。
如果我理解正确,您希望找到所有 ID1 成员 "known" 但不将任何其他 ID2 成员识别为 ID1 成员的 ID2 子集 你能试试那样吗
val id1Pointers : Map[Int,Set[Int]] = myData.groupBy(_._1).mapValues(_.map(_._2).toSet)
val id2Optionals: Set[Int] = id1Pointers.values.reduce( _ intersect _)
val finalId2 = id2Optionals.filter(id2 => (id1Pointers.getOrElse(id2,Set[Int]()).subsetOf(id2Optionals)))
println(finalId2.mkString("&"))