使用Jung删除RDF图表死胡同

时间:2016-06-01 19:46:36

标签: java rdf jung

我正在尝试实现一种从RDF图中删除死胡子的方法

Iterator<String> iter = rdfGraph.getVertices().iterator();  
    while(iter.hasNext()){
        String x = iter.next();
        if(rdfGraph.outDegree(x)==0){

            iter.remove();
        }

    }

每当我运行这个时,我都会得到一个java.lang.UnsupportedOperationException。我该如何修复我的代码。

1 个答案:

答案 0 :(得分:4)

迭代器的remove()方法是可选的。 javadoc提到,当它不受支持时,会抛出 UnsupportedOperationException

  

抛出:

     

UnsupportedOperationException - 如果不执行remove操作   这个迭代器支持

根据adding a node to a collection using JUNG2中的讨论,我假设 getVertices()返回一个不可修改的集合,在这种情况下,迭代器不支持删除()即可。请注意, getVertices()的javadoc表示该方法返回顶点的视图。它并不是说从集合中添加或删除会从图表中添加或删除顶点,或者甚至可以在集合中添加或删除顶点。

  

getVertices Collection<V> getVertices()

     

返回此图中所有顶点的视图。一般来说,这遵守收集合同,因此不作任何保证   集合中顶点的排序。

而不是 iter.remove(),使用 rdfGraph.removeVertex(x)可能更有意义。

但是,根据你的评论

  

我最初使用了rdfGraph.removeVertex(x)但是我得到了一个java.util.ConcurrentModificationException。如何在不使用迭代器的情况下绕过这个?

听起来你要么需要遍历顶点并创建一个新的集合,要么删除它们,然后在迭代顶点后删除它们。或者,您可以创建所有顶点的新集合,然后在经过时将其删除。例如,

new ArrayList<>(rdfGraph.getVertices()).stream()
  .filter(v -> rdfGraph.outDegree(x) == 0)
  .forEach(rdfGraph::removeVertex);

使用ArrayList并不重要;你只需要一些与原始图形无关的新系列。