package timeflow.data.db; import java.util.*; import timeflow.data.time.RoughTime; public abstract class ActComparator implements Comparator { protected Field field; protected boolean ascending=true; protected String description; private ActComparator(Field field, String description) { this.field=field; this.description=description; } public String getDescription() { return description + (ascending ? "" : " (descending)"); } public static ActComparator by(Field field) { Class type=field.getType(); if (type==Double.class) return new NumberComparator(field); if (type==String[].class) return new ArrayComparator(field); if (type==RoughTime.class) return new TimeComparator(field); return new StringComparator(field); } static class TimeComparator extends ActComparator { TimeComparator(Field field) { super(field, "by time"); } @Override public int compare(Act o1, Act o2) { RoughTime a1=o1.getTime(field); RoughTime a2=o2.getTime(field); if (a1==a2) return 0; if (a1==null) return ascending ? 1 : -1; if (a2==null) return ascending ? -1 : 1; int n=a1.compareTo(a2); return ascending ? n : -n; } } static class ArrayComparator extends ActComparator { ArrayComparator(Field field) { super(field, "by length of "+field.getName()); } @Override public int compare(Act o1, Act o2) { int n=length(o1.getTextList(field))-length(o2.getTextList(field)); return ascending ? n : -n; } static int length(String[] s) { return s==null ? 0 : s.length; } } static class StringComparator extends ActComparator { StringComparator(Field field) { super(field, "by "+field.getName()); } @Override public int compare(Act o1, Act o2) { int n=val(o1.getString(field)).toString().compareTo(val(o2.getString(field)).toString()); return ascending ? n : -n; } String val(String s) { return s==null ? "" : s; } } static class NumberComparator extends ActComparator { NumberComparator(Field field) { super(field, "by "+field.getName()); } @Override public int compare(Act o1, Act o2) { double x=o1.getValue(field)-o2.getValue(field); int n=x>0 ? 1 : x<0 ? -1 : 0; return ascending ? n : -n; } } }