代码之家  ›  专栏  ›  技术社区  ›  Ibrahim A

使用Jung移除RDF图形死区

  •  1
  • Ibrahim A  · 技术社区  · 8 年前

    我正在尝试实现一种从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 回复  |  直到 8 年前
        1
  •  4
  •   Community Reversed Engineer    7 年前

    迭代器的 remove() 方法是可选的。javadoc提到,当它不受支持时,它将抛出一个 不受支持的操作异常 :

    投掷次数:

    UnsupportedOperationException-如果删除操作不是 此迭代器支持

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

    获取顶点 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的使用在那里并不重要;您只需要一些未连接到原始图形的新集合。