@Override public int compareTo(Object o) { if (this == o) return 0; if (!(o instanceof InferenceLogItem)) getClass().getName().compareTo(o.getClass().getName()); InferenceLogItem item = (InferenceLogItem) o; int c = ruleLabel.compareTo(item.ruleLabel); if (c != 0) return c; c = ruleInferenceStatuses.size() - item.ruleInferenceStatuses.size(); if (c != 0) return c; if (ruleInferenceStatuses.size() == 0) return 0; if (ruleInferenceStatuses.containsKey(RuleType.STRICT) && !item.ruleInferenceStatuses.containsKey(RuleType.STRICT)) return Integer.MIN_VALUE; if (ruleInferenceStatuses.containsKey(RuleType.DEFEASIBLE) && !item.ruleInferenceStatuses.containsKey(RuleType.DEFEASIBLE)) return Integer.MAX_VALUE; for (Entry<RuleType, Set<Conclusion>> entry : conclusions.entrySet()) { RuleType ruleType = entry.getKey(); c = ruleInferenceStatuses.get(ruleType).compareTo(item.ruleInferenceStatuses.get(ruleType)); if (c != 0) return c; Set<Conclusion> conclusionSet = entry.getValue(); Set<Conclusion> iconclusionSet = item.conclusions.get(ruleType); c = conclusionSet.size() - iconclusionSet.size(); if (c != 0) return c; Iterator<Conclusion> it = conclusionSet.iterator(); Iterator<Conclusion> iit = iconclusionSet.iterator(); while (it.hasNext()) { Conclusion cc = it.next(); Conclusion cci = iit.next(); c = cc.compareTo(cci); if (c != 0) return c; } } return 0; }