package com.anjlab.ping.services; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class SpareIterator<T, C extends Comparable<C>> implements Iterable<T>, Iterator<T> { private final List<T> items; private int counter; private int middle; private int correction; public SpareIterator(List<T> items, final Colorer<T, C> colorer) { this.items = items; this.counter = 0; this.middle = items.size() / 2; this.correction = items.size() % 2 == 0 ? 0 : 1; final Map<C, Integer> colorCount = new HashMap<C, Integer>(); for (T item : items) { C color = colorer.getColor(item); Integer count = colorCount.get(color); count = count == null ? 1 : count + 1; colorCount.put(color, count); } Collections.sort(this.items, new Comparator<T>() { public int compare(T o1, T o2) { C c1 = colorer.getColor(o1); C c2 = colorer.getColor(o1); return colorCount.get(c1).compareTo(colorCount.get(c2)); }; }); } @Override public Iterator<T> iterator() { return this; } @Override public boolean hasNext() { return counter < items.size(); } @Override public T next() { int index; index = counter % 2 == 0 ? (counter / 2) : (middle + counter / 2 + correction); counter++; return items.get(index); } @Override public void remove() { throw new UnsupportedOperationException(); } }