package org.ggp.base.apps.research; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeSet; /** * Aggregation is a way of storing data about an unordered collection, mapping * each element to an associated data object, and then visualizing the data by * sorting the elements by their associated data and printing out the sorted list. * The data objects must be comparable to each other, so they can be sorted. * * @author Sam Schreiber */ public abstract class Aggregation<T extends Comparable<T>> { private final Map<String, T> entryData = new HashMap<String, T>(); boolean containsEntry(String key) { return entryData.containsKey(key); } void createEntry(String key, T data) { entryData.put(key, data); } T getEntryData(String key) { return entryData.get(key); } private final class EntryComparator implements Comparator<Map.Entry<String,T>> { @Override public int compare(Map.Entry<String,T> a, Map.Entry<String,T> b) { return a.getValue().compareTo(b.getValue()); } } @Override public String toString() { int nMaxLength = 0; StringBuilder theStringRep = new StringBuilder(); TreeSet<Map.Entry<String,T>> theEntries = new TreeSet<Map.Entry<String,T>>(new EntryComparator()); theEntries.addAll(entryData.entrySet()); for (Map.Entry<String,T> entry : theEntries) { nMaxLength = Math.max(nMaxLength, entry.getKey().length()); } for (Map.Entry<String,T> entry : theEntries) { theStringRep.append(String.format("%1$-" + (nMaxLength + 5) + "s", entry.getKey()) + entry.getValue() + "\n"); } return theStringRep.toString(); } }