冻结循环

时间:2015-12-22 12:03:50

标签: java iterator jena

我有一个while循环的问题。这是代码:

ExtendedIterator<Statement> statementIt = m.listStatements(null, p, obj);
Statement stamt = null;
List<Resource> lres = new ArrayList<Resource>();
System.out.println("\tdebugging: going into the while");
int counter = 0; 
while (statementIt.hasNext())
{
    System.out.println("\tdebugging: statementIt.hasNext()? " + statementIt.hasNext());
    System.out.println("\t\tdebugging: \t started round " + counter);
    stamt = (Statement)statementIt.next();
    if(!lres.contains((Resource)stamt.getSubject()))
        lres.add((Resource)stamt.getSubject());
    counter++;
    System.out.println("\t\tdebugging: counter is next at " + counter);
    System.out.println("\t\tdebugging: will be next? " + statementIt.hasNext());
    System.out.println("dadada dbdbdb");
}
System.out.println("\tdebugging: came out of the while alive!");

我知道事实上只有3次迭代要做,所以var counter应该加起来3然后它会离开循环,但是当计数器变成3并且它是执行hasNext()程序冻结的时间。

我不知道我是不是通过了一些重要的或基本的东西,但是我把头发拉过来:(

修改:

它应该执行循环2次,而不是3.所以它是与hasNext()执行相关的东西,我想说。 这是我用来演绎的while循环的“新”主体:

stamt = (Statement)statementIt.next();
if(!lres.contains((Resource)stamt.getSubject()))
    lres.add((Resource)stamt.getSubject());
counter++;
System.out.println("\t\tdebugging: this loop subject was " + ((Resource)stamt.getSubject()).toString());

打印2次并在第3次尝试打印时冻结。

EDIT2:

这是执行此操作而没有问题的C#代码:

ExtendedIterator statementIt = m.listStatements(null, p, obj);
int quantity = 0;
Statement stamt = null;
List<Resource> lres = new List<Resource>();
while (statementIt.hasNext())
{
    stamt = (Statement)statementIt.next();
    quantity++;
    if(!lres.Contains((Resource)stamt.getSubject()))
        lres.Add((Resource)stamt.getSubject());
}

EDIT3:

它绝对与迭代器有关(将ExtendedIterator<Statement>更改为StmtIterator以获得更好的性能,与手头的问题无关)。我将展示后续陈述的印刷品:

[http://practicum/luis/ontologies/2015/8/document#BibRef2, http://practicum/luis/ontologies/2015/8/document#pointsAt, http://practicum/luis/ontologies/2015/8/document#Doc2]
[http://practicum/luis/ontologies/2015/8/document#BibRef1, http://practicum/luis/ontologies/2015/8/document#pointsAt, http://practicum/luis/ontologies/2015/8/document#Doc2]
[-75c480c5:151c9f1b5af:-7f54, http://practicum/luis/ontologies/2015/8/document#pointsAt, http://practicum/luis/ontologies/2015/8/document#Doc2]

最后一次打印是不需要的。迭代器不应该考虑该主题(十六进制组合的第一个元素),不应该在列表中。这是一个内存空间(我猜)并且与通过读取我的.rdf文件&gt;加载的OntModel无关:(

Jena Package的这些工具到底有什么问题?

1 个答案:

答案 0 :(得分:0)

好的,问题解决了。

上次编辑中打印的空间存储器实际上是本体的空白节点,因此打印。由于我只想要考虑URI资源,所以我应该包括这种检查。

if(!stamt.getSubject().isURIResource())
    break;

干杯〜

PS:尽管原始问题尚未解决(.hasNext()冻结程序)我的具体问题已经解决,我不再停滞不前。我现在很惊讶我的C#程序没有这类问题。