package models.helpers; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; /** * A helper class for sorting/filtering <code>Iterable</code>s. */ public class Mapper { /** * Return a <code>Map</code>'s key sorted in order of the corresponding * values (which must be Comparable). * * Code adapted from a forum post retrieved 2010-11-01 from * http://www.programmersheaven.com/download/49349/download.aspx * * @param map * the map whose keys are to be sorted * @return the sorted list of keys */ public static <T> List<T> sortByValue(Map<T, ? extends Comparable> map) { List<Map.Entry> list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry>() { public int compare(Map.Entry e1, Map.Entry e2) { return ((Comparable) e1.getValue()).compareTo(e2.getValue()); } }); List<T> result = new ArrayList(); for (Map.Entry<T, Comparable> entry : list) { result.add(entry.getKey()); } return result; } /** * Sort an <code>Iterable</code> according to a sorting <code>Filter</code>. * * @param iterable * the iterable whose values are to be sorted. * @param filter * the sorting filter to be used for generating sort keys * @return the sorted list */ public static <T> List<T> sort(Iterable<T> iterable, IFilter<T, ? extends Comparable> filter) { Map<T, Comparable> map = new HashMap(); for (T object : iterable) { Comparable value = filter.visit(object); if (value != null) { map.put(object, value); } } return sortByValue(map); } /** * Filter objects out of an <code>Iterable</code>. * * @param iterable * the iterable to filter through * @param filter * the filter to be used for deciding which objects to keep * @return the filtered list */ public static <T> List<T> filter(Iterable<T> iterable, IFilter<T, Boolean> filter) { List<T> result = new ArrayList(); for (T object : iterable) { if (filter.visit(object)) { result.add(object); } } return result; } }