Scala:HashSet交集

问题描述 投票:0回答:1

我有(ID1 ID2)的2000多行,从文本文件中每行用空格隔开。 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),...)

我的代码的目标是找到哪个ID2在每个ID1中涉及/包含/相交。最后,打印出ID2,即(ID1_1,ID2_EVERYONE),(ID1_2,ID2_EVERYONE), (ID1_3,ID2_EVERYONE), (ID1_4,ID_EVERYONE), ... ,(ID1_100,ID2_EVERYONE)

print ID_EVERYONE

UPDATED这里给我的示例一个较小的组大小,对于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也应被过滤掉。

scala tuples intersection hashset
1个回答
0
投票

如果我理解正确,您希望找到所有ID1成员都“知道”但没有将其他任何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("&"))
© www.soinside.com 2019 - 2024. All rights reserved.