我正在尝试实现一种从RDF图中删除死胡子的方法
Iterator<String> iter = rdfGraph.getVertices().iterator();
while(iter.hasNext()){
String x = iter.next();
if(rdfGraph.outDegree(x)==0){
iter.remove();
}
}
每当我运行这个时,我都会得到一个java.lang.UnsupportedOperationException。我该如何修复我的代码。
答案 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并不重要;你只需要一些与原始图形无关的新系列。