HistoDbAttributeId implements Comparable<HistoDbAttributeId> { @Override public int compareTo(HistoDbAttributeId o) { if (this instanceof HistoDbNetworkAttributeId && o instanceof HistoDbNetworkAttributeId) { HistoDbNetworkAttributeId id1 = (HistoDbNetworkAttributeId) this; HistoDbNetworkAttributeId id2 = (HistoDbNetworkAttributeId) o; int c = id1.getEquipmentId().compareTo(id2.getEquipmentId()); if (c == 0) { if (id1.getSide() == null && id2.getSide() == null) { c = 0; } else if (id1.getSide() != null && id2.getSide() != null) { c = id1.getSide().compareTo(id2.getSide()); } else if (id1.getSide() == null && id2.getSide() != null) { c = -1; } else if (id1.getSide() != null && id2.getSide() == null) { c = 1; } else { throw new AssertionError(); } if (c == 0) { c = id1.getAttributeType().compareTo(id2.getAttributeType()); } } return c; } else if (this instanceof HistoDbMetaAttributeId && o instanceof HistoDbMetaAttributeId) { return ((HistoDbMetaAttributeId) this).getType().compareTo(((HistoDbMetaAttributeId) o).getType()); } else if (this instanceof HistoDbNetworkAttributeId && o instanceof HistoDbMetaAttributeId) { return 1; } else if (this instanceof HistoDbMetaAttributeId && o instanceof HistoDbNetworkAttributeId) { return -1; } else { throw new AssertionError(); } }  @Override int compareTo(HistoDbAttributeId o);  }
@Test public void testCompareTo() throws Exception { TreeSet<HistoDbAttributeId> attributeIds = new TreeSet<>(); attributeIds.add(HistoDbMetaAttributeId.daytime); HistoDbNetworkAttributeId attrId1 = new HistoDbNetworkAttributeId("eq1", HistoDbAttr.P); attributeIds.add(attrId1); attributeIds.add(HistoDbMetaAttributeId.cimName); HistoDbNetworkAttributeId attrId2 = new HistoDbNetworkAttributeId("eq2", "s1", HistoDbAttr.Q); attributeIds.add(attrId2); Iterator<HistoDbAttributeId> it = attributeIds.iterator(); assertEquals(it.next(), HistoDbMetaAttributeId.cimName); assertEquals(it.next(), HistoDbMetaAttributeId.daytime); assertEquals(it.next(), attrId1); assertEquals(it.next(), attrId2); }