我有一个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的这些工具到底有什么问题?
答案 0 :(得分:0)
好的,问题解决了。
上次编辑中打印的空间存储器实际上是本体的空白节点,因此应打印。由于我只想要考虑URI资源,所以我应该包括这种检查。
if(!stamt.getSubject().isURIResource())
break;
干杯〜
PS:尽管原始问题尚未解决(.hasNext()冻结程序)我的具体问题已经解决,我不再停滞不前。我现在很惊讶我的C#程序没有这类问题。