package com.zarkonnen.util; import java.util.Collection; /** * Used for keeping track of where you are in a collection/array being iterated over. Use by * initialising with the collection/array before the loop and embedding a switch on the next() Mode * value into the loop. *

* Example (on an array of Kittens): *

 * StringBuilder kittenInfo = new StringBuilder("I have no kittens.");
 * Counter kc = new Counter(kittens);
 * for (Kitten k : kittens) switch (kc.next()) {
 *     case one:   kittenInfo = new StringBuilder("My kitten is called " + k.getName() + "."); break;
 *     case first: kittenInfo = new StringBuilder("My kittens are called " + k.getName()); break;
 *     case item:  kittenInfo.append(", " + k.getName()); break;
 *     case last:  kittenInfo.append(" and " + k.getName() + "."); break;
 * }
* * LICENCE: This code is licenced under a BSD licence. Feel free to alter and redistribute. * * @author David Stark, http://www.zarkonnen.com * @version 1.0 (2007-07-11) */ public class Counter { /** * An enumeration of modes identifying where in the collection/array we are. */ public enum Where { /** The only element of an array/collection of size 1. */ one, /** The first element. */ first, /** The last element of the array/collection. */ last, /** Any other element somewhere in the middle. */ item } private int size; private int nextIndex = 0; /** * @param c A collection to keep track of. If its size changes between now and the * iteration, strange things will happen. */ public Counter(Collection c) { size = c.size(); } /** * @param a An array to keep track of. If its size changes between now and the iteration, * strange things will happen. */ public Counter(Object[] a) { size = a.length; } /** * @return A Where enum value for where in the array/collection we now are: * */ public Where next() { return size == 1 ? Where.one : nextIndex++ == 0 ? Where.first : nextIndex == size ? Where.last : Where.item ; } /** * @return Which index of the array/collection we're currently at. */ public int index() { return nextIndex == 0 ? 0 : nextIndex - 1; } }