冻结 while 循环
Frozen while loop
我对 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 循环的 "new" 主体:
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 次时被冻结。
编辑2:
这是可以毫无问题地执行此操作的 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());
}
编辑3:
它绝对与迭代器有关(将 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]
最后打印的是不需要的。迭代器不应考虑该主题(十六进制的第一个元素),不应在列表中。那是一段记忆 space(我猜),与通过读取我的 .rdf 文件加载的 OntModel 无关 >:(
耶拿包的这些工具到底有什么问题????
好的,问题解决了。
上次编辑打印的注释space内存实际上是ontology的空白节点,所以应该打印。因为我只想考虑 URI 资源,所以我应该包括这种检查。
if(!stamt.getSubject().isURIResource())
break;
干杯~
PS: 虽然原来的问题还没有解决(.hasNext() 冻结程序)我的具体问题已经解决了,我不再停滞不前了。我现在很惊讶我的 C# 程序没有出现此类问题。
我对 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 循环的 "new" 主体:
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 次时被冻结。
编辑2:
这是可以毫无问题地执行此操作的 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());
}
编辑3:
它绝对与迭代器有关(将 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]
最后打印的是不需要的。迭代器不应考虑该主题(十六进制的第一个元素),不应在列表中。那是一段记忆 space(我猜),与通过读取我的 .rdf 文件加载的 OntModel 无关 >:(
耶拿包的这些工具到底有什么问题????
好的,问题解决了。
上次编辑打印的注释space内存实际上是ontology的空白节点,所以应该打印。因为我只想考虑 URI 资源,所以我应该包括这种检查。
if(!stamt.getSubject().isURIResource())
break;
干杯~
PS: 虽然原来的问题还没有解决(.hasNext() 冻结程序)我的具体问题已经解决了,我不再停滞不前了。我现在很惊讶我的 C# 程序没有出现此类问题。