+ }\r
+\r
+ private static class CollisionSubjectProcedure implements TIntObjectProcedure<TIntObjectHashMap<TIntArrayList>> {\r
+ CollisionPredicateProcedure predicateProcedure;\r
+\r
+ public CollisionSubjectProcedure(CollisionPredicateProcedure predicateProcedure) {\r
+ this.predicateProcedure = predicateProcedure;\r
+ }\r
+\r
+ @Override\r
+ public boolean execute(int subject, TIntObjectHashMap<TIntArrayList> predicateObjectMap) {\r
+ predicateProcedure.subject = subject;\r
+ predicateObjectMap.forEachEntry(predicateProcedure);\r
+ return true;\r
+ }\r
+\r
+ }\r
+\r
+ private static class CollisionPredicateProcedure implements TIntObjectProcedure<TIntArrayList> {\r
+ ArrayList<StatementCollision> collisions;\r
+ int subject;\r
+ \r
+ public CollisionPredicateProcedure(ArrayList<StatementCollision> collisions) {\r
+ this.collisions = collisions;\r
+ }\r
+ \r
+ @Override\r
+ public boolean execute(int predicate, TIntArrayList objects) {\r
+ if(objects.size() > 1) {\r
+ objects.sort();\r
+ int oldObject = objects.get(0);\r
+ int collisionCount = 1;\r
+ for(int i=1;i<objects.size();++i) {\r
+ int curObject = objects.get(i);\r
+ if(curObject == oldObject) {\r
+ ++collisionCount;\r
+ }\r
+ else {\r
+ if(collisionCount > 1) {\r
+ collisions.add(new StatementCollision(subject, predicate, oldObject, collisionCount));\r
+ collisionCount = 1;\r
+ }\r
+ oldObject = curObject;\r
+ }\r
+ }\r
+ if(collisionCount > 1)\r
+ collisions.add(new StatementCollision(subject, predicate, oldObject, collisionCount));\r
+ }\r
+ return true;\r
+ }\r
+\r
+ }\r
+\r
+ public ArrayList<StatementCollision> getCollisions() {\r
+ ArrayList<StatementCollision> collisions = new ArrayList<StatementCollision>();\r
+ CollisionPredicateProcedure predicateProcedure = new CollisionPredicateProcedure(collisions);\r
+ CollisionSubjectProcedure subjectProcedure = new CollisionSubjectProcedure(predicateProcedure);\r
+ statements.forEachEntry(subjectProcedure);\r
+ return collisions;\r