package polly.rx.core; import java.util.Collections; import java.util.Comparator; import java.util.List; import polly.rx.entities.TrainEntityV3; public class TrainSorter { private final static Comparator<TrainEntityV3> BY_TRAINER = new Comparator<TrainEntityV3>() { @Override public int compare(TrainEntityV3 te1, TrainEntityV3 te2) { return Integer.compare(te1.getTrainerId(), te2.getTrainerId()); } }; private final static Comparator<TrainEntityV3> BY_USER = new Comparator<TrainEntityV3>() { @Override public int compare(TrainEntityV3 te1, TrainEntityV3 te2) { return te1.getForUser().compareTo(te2.getForUser()); } }; private final static Comparator<TrainEntityV3> BY_TYPE = new Comparator<TrainEntityV3>() { @Override public int compare(TrainEntityV3 te1, TrainEntityV3 te2) { return te1.getType().compareTo(te2.getType()); } }; private final static Comparator<TrainEntityV3> BY_COSTS = new Comparator<TrainEntityV3>() { @Override public int compare(TrainEntityV3 te1, TrainEntityV3 te2) { return Integer.compare(te1.getCosts(), te2.getCosts()); } }; private final static Comparator<TrainEntityV3> BY_FACTOR = new Comparator<TrainEntityV3>() { @Override public int compare(TrainEntityV3 te1, TrainEntityV3 te2) { return Double.compare(te1.getFactor(), te2.getFactor()); } }; private final static Comparator<TrainEntityV3> BY_WEiGHTED = new Comparator<TrainEntityV3>() { @Override public int compare(TrainEntityV3 te1, TrainEntityV3 te2) { return Double.compare(te1.getFactor() * te1.getCosts(), te2.getFactor() * te2.getCosts()); } }; private final static Comparator<TrainEntityV3> BY_START = new Comparator<TrainEntityV3>() { @Override public int compare(TrainEntityV3 te1, TrainEntityV3 te2) { return te1.getTrainStart().compareTo(te2.getTrainStart()); } }; private final static Comparator<TrainEntityV3> BY_FINISHED = new Comparator<TrainEntityV3>() { @Override public int compare(TrainEntityV3 te1, TrainEntityV3 te2) { return te1.getTrainFinished().compareTo(te2.getTrainFinished()); } }; private final static Comparator<TrainEntityV3> BY_DURATION = new Comparator<TrainEntityV3>() { @Override public int compare(TrainEntityV3 te1, TrainEntityV3 te2) { return Long.compare(te1.getDuration(), te2.getDuration()); } }; private static class ReversingComparator implements Comparator<TrainEntityV3> { private Comparator<TrainEntityV3> comp; public ReversingComparator(Comparator<TrainEntityV3> comp) { this.comp = comp; } @Override public int compare(TrainEntityV3 o1, TrainEntityV3 o2) { return this.comp.compare(o2, o1); } } public static enum SortKey { BY_TRAINER(TrainSorter.BY_TRAINER), BY_USER(TrainSorter.BY_USER), BY_TYPE(TrainSorter.BY_TYPE), BY_COSTS(TrainSorter.BY_COSTS), BY_WEIGHTED(TrainSorter.BY_WEiGHTED), BY_FACTOR(TrainSorter.BY_FACTOR), BY_START(TrainSorter.BY_START), BY_FINISHED(TrainSorter.BY_FINISHED), BY_DURATION(TrainSorter.BY_DURATION), NONE(null); private Comparator<TrainEntityV3> comp; public static SortKey parseSortKey(String key) { try { return SortKey.valueOf(key); } catch (Exception e) { return SortKey.NONE; } } private SortKey(Comparator<TrainEntityV3> comp) { this.comp = comp; } public Comparator<TrainEntityV3> getComparator() { return this.comp; } } public static void sort(List<TrainEntityV3> list, SortKey key, boolean desc) { if (key != SortKey.NONE) { Comparator<TrainEntityV3> c = desc ? new ReversingComparator(key.getComparator()) : key.getComparator(); Collections.sort(list, c); } } }