【发布时间】:2017-12-30 22:15:04
【问题描述】:
我使用 GraphX API 在 Scala 中构建了一个图表。在我的图中,每个顶点都有一个LinkedHashMap[Int, ListBuffer[ListBuffer[Int]]] 作为属性:LinkedHashMap 的每一对(键、值)代表:
- key:节点的id - 如
Int - 值:到达节点的所有可能路径 - 每条路径都是
ListBuffer[Int],所以我有ListBuffer的ListBuffer[Int]
(我使用Pregel 来创建LinkedHashMaps)。
所以,我想实现从图中删除节点的情况。我要做的是:
- 在每个
LinkedHashMap中删除键 == id_of_the_node 的元素 - 删除每个
ListBuffer[ListBuffer[Int]]中包含已删除节点的列表(路径)(路径将不再存在)。
假设我有以下节点(我将省略其他节点):
节点 1:(1,Map(5 -> ListBuffer(ListBuffer(1, 3, 5), ListBuffer(1, 4, 5)), 6 -> ListBuffer(ListBuffer(1, 3, 6)), 3 -> ListBuffer(ListBuffer(1, 3)), 4 -> ListBuffer(ListBuffer(1, 4)), 1 -> ListBuffer(ListBuffer(1))))
节点 2:(2,Map(5 -> ListBuffer(ListBuffer(2, 1, 3, 5), ListBuffer(2, 1, 4, 5)), 6 -> ListBuffer(ListBuffer(2, 1, 3, 6)), 3 -> ListBuffer(ListBuffer(2, 1, 3)), 4 -> ListBuffer(ListBuffer(2, 1, 4)), 1 -> ListBuffer(ListBuffer(2, 1)), 2 -> ListBuffer(ListBuffer(2))))
节点 3:(3,Map(5 -> ListBuffer(ListBuffer(3, 5)), 6 -> ListBuffer(ListBuffer(3, 6)), 3 -> ListBuffer(ListBuffer(3))))
假设我想从myGraph 中删除节点3。那么,节点的属性应该变成:
节点 1:(1, Map(5 -> ListBuffer(ListBuffer(1, 4, 5)), 4 -> ListBuffer(ListBuffer(1, 4)), 1 -> ListBuffer(ListBuffer(1))))
节点 2:(2, Map(5 -> ListBuffer(ListBuffer(2, 1, 4, 5)), 4 -> ListBuffer(ListBuffer(2, 1, 4)), 1 -> ListBuffer(ListBuffer(2, 1)), 2 -> ListBuffer(ListBuffer(2))))
节点 3:(-1, LinkedHashMap[ListBuffer[ListBuffer[]]]()) - 我不知道如何分配一个空的 LinkedHashMap[ListBuffer[ListBuffer[Int]]]。
我定义了以下方法:
def del(nodeToDelete: Int, vertexMap: collection.mutable.LinkedHashMap[Int,ListBuffer[ListBuffer[Int]]]): collection.mutable.LinkedHashMap[Int,ListBuffer[ListBuffer[Int]]] = {
vertexMap.keySet.foreach{ k =>
if(k == nodeToDelete) vertexMap.remove(k)
}
vertexMap
}
但这只是针对上面提到的1 点(删除带有键== id_of_the_node 的元素)。另外,如果我如下在myGraph 的顶点上调用它,它不会给我想要的结果。
myGraph.vertices.map(vertex => vertex._2).map(myMap => del(3,myMap))
如何正确编写方法(实现1和2这两个点)?以及如何在myGraph.vertices 上使用它?在伪代码中:
foreach key k of vertexMap
if(k == nodeToDelete) vertexMap.remove(k)
foreach ListBuffer l1
foreach ListBuffer l2
if (l2.contains(nodeTodelete)) remove the list
if(l1 is empty) vertexMap.remove(k)
另外,LinkedHashMap 是 remove 方法时间复杂度最高的数据结构吗?
【问题讨论】:
标签: scala linkedhashmap spark-graphx listbuffer