我需要根据我的程序动态创建的程度对节点进行排序。
我尝试使用Collections.sort()但它抛出一个空指针异常。 nodeList 参数是我的程序创建的节点列表。我尝试了几种不同的配置,但它没有用。
private void sortNodes(List<Node> nodeList){
Collections.sort(nodeList, new GraphModel());
}
public int compare(Node n1, Node n2) {
int n1Degree,n2Degree;
try ( Transaction tx = graphDb.beginTx() ) {
n1Degree = n1.getDegree();
n2Degree = n2.getDegree();
tx.success();
}
if(n1Degree<n2Degree){
return -1;
}
else if(n1Degree==n2Degree){
return 0;
}
else{
return 1;
}
}
编辑:我正在添加代码的相关部分。
public class GraphModel implements Comparator<Node> {
GraphDatabaseService graphDb;
List<Node> nodeList=new ArrayList<>();
//constructor
public GraphModel(String sentence, String MemoryName){
Memory mem=new Memory();
graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(mem.getMemoryAddress(MemoryName));
registerShutdownHook( graphDb );
....
some more code here without any problem
nodeList populated without any problem
....
sortNodes(nodeList);
} //end of constructor
}
Node类是Neo4j的Node类。
这是堆栈跟踪:第275行是&#34;尝试(事务tx = graphDb.beginTx()&#34;在上面的比较方法中。
Exception in thread "main" java.lang.NullPointerException
at GraphModel.GraphModel.compare(GraphModel.java:275)
at GraphModel.GraphModel.compare(GraphModel.java:22)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:351)
at java.util.TimSort.sort(TimSort.java:216)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1454)
at java.util.Collections.sort(Collections.java:175)
at GraphModel.GraphModel.highestDegreeNodes(GraphModel.java:137)
at GraphModel.GraphModel.<init>(GraphModel.java:130)
at com.company.Tester.main(Tester.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
答案 0 :(得分:1)
您的代码并未经过深思熟虑。
排序应该在TX中进行,排序方法应该只是
public class NodeDegreeComparer implements Comparator<Node> {
public int compare(Node n1, Node n2) {
return Integer.compare(n1.getDegree(),n2.getDegree());
}
}
graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(PATH);
registerShutdownHook( graphDb );
try (Transaction tx = graphDb.beginTx()) {
Collections.sort(nodeList, new NodeDegreeComparer());
tx.success();
}