package glug.gui; import static java.lang.Math.min; import glug.parser.ThreadId; import java.util.Comparator; import java.util.List; public class NiceOrderBasedOnNumericThreadIdComparator implements Comparator<ThreadId> { public static final NiceOrderBasedOnNumericThreadIdComparator INSTANCE = new NiceOrderBasedOnNumericThreadIdComparator(); @Override public int compare(ThreadId t1, ThreadId t2) { return compareThreadNameParts(t1.getParts(), t2.getParts()); } private int compareThreadNameParts(List<Comparable<?>> t1parts, List<Comparable<?>> t2parts) { int maxNumParts = min(t1parts.size(), t2parts.size()); for (int partIndex = 0; partIndex<maxNumParts; ++ partIndex) { Comparable<?> t1part = t1parts.get(partIndex), t2part = t2parts.get(partIndex); if (t1part instanceof String) { if (t2part instanceof Integer) { return 1; } String t1partString = (String) t1part, t2PartString = (String) t2part; int partComparision = t1partString.compareTo(t2PartString); if (partComparision!=0) return partComparision; } if (t1part instanceof Integer) { if (t2part instanceof String) { return -1; } int t1partInt = (Integer) t1part, t2PartInt = (Integer) t2part; int partComparision = t1partInt - t2PartInt; if (partComparision!=0) return partComparision; } } return t1parts.size() - t2parts.size(); } }