Neo4j Iterable<String> getPropertyKeys() 无限循环?这是一个错误吗?
Posted
技术标签:
【中文标题】Neo4j Iterable<String> getPropertyKeys() 无限循环?这是一个错误吗?【英文标题】:Neo4j Iterable<String> getPropertyKeys() loops infinitely? is this a bug? 【发布时间】:2015-03-07 04:25:16 【问题描述】:我只是想从关系中复制属性键。如果我使用此代码。
Iterable<String> tempkeys;
tempkeys= rel.getPropertyKeys();
while (tempkeys.iterator().hasNext())
String key = tempkeys.iterator().next();
System.out.println(key);
它无限循环。如果我将 Iterable 重铸为 Arraylist,那么它可以完美运行
ArrayList<String> tempkeys;
tempkeys= (ArrayList<String>) rel.getPropertyKeys();
for (int i=0;i<=tempkeys.size();i++)
String key = tempkeys.iterator().next();
System.out.println(key);
如果我调试代码,很明显可迭代计数器在每次调用 .next() 后重置为 0。它在调用期间递增到 1,但在下一次调用 .hasNext() 时又回到 0。
上下文如下。
try (Transaction tx = this.graphDb.beginTx())
Node Node1 = JavaCluster.AddUniqueNode("Element", "Name", "Node1");
Node Node2 = JavaCluster.AddUniqueNode("Element", "Name", "Node2");
RelationshipType tt = DynamicRelationshipType.withName("rt");
Relationship rel = Node1.createRelationshipTo(Node2, tt);
rel.setProperty("prop1", "propval1");
rel.setProperty("prop2", "propval2");
ArrayList<String> tempkeys;
tempkeys= (ArrayList<String>) rel.getPropertyKeys();
for (int i=0;i<=tempkeys.size();i++)
String key = tempkeys.iterator().next();
System.out.println(key);
tx.success();
catch (Exception e)
System.out.println("Error - exception " + e.toString());
//throw new TransactionFailException("Transaction failed",e);
【问题讨论】:
【参考方案1】:您在循环的每次迭代中创建一个新的迭代器,这意味着tempkeys.iterator().hasNext()
始终返回true
,String key = tempkeys.iterator().next();
始终返回第一个元素。
您应该在循环外创建一次迭代器,并在每次调用next()
和hasNext()
时使用相同的迭代器。
Iterable<String> tempkeys;
tempkeys = rel.getPropertyKeys();
Iterator<String> iter = tempkeys.iterator();
while (iter.hasNext())
String key = iter.next();
System.out.println(key);
顺便说一句,您的第二个循环(for 循环)虽然不会产生无限循环,但仍然是错误的,因为它将在每次迭代中返回列表的第一个元素。
【讨论】:
谢谢,奇怪的是主代码中的等效循环 Iterable以上是关于Neo4j Iterable<String> getPropertyKeys() 无限循环?这是一个错误吗?的主要内容,如果未能解决你的问题,请参考以下文章
_TypeError(类型 '_InternalLinkedHashMap<String, dynamic>' 不是类型 'Iterable<dynamic>' 的子类型) F
Flutter Json 未处理异常:类型“_InternalLinkedHashMap<String, dynamic>”不是“Iterable<dynamic>”类型的子类