2013/3/2 Thomas Neidhart <thomas.neidh...@gmail.com> > On 03/02/2013 07:33 PM, Benedikt Ritter wrote: > > 2013/3/2 <t...@apache.org> > > > >> Author: tn > >> Date: Sat Mar 2 18:12:46 2013 > >> New Revision: 1451914 > >> > >> URL: http://svn.apache.org/r1451914 > >> Log: > >> [COLLECTIONS-366] Added ListUtils.range methods. > >> > >> Modified: > >> > >> > commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java > >> > >> Modified: > >> > commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java > >> URL: > >> > http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java?rev=1451914&r1=1451913&r2=1451914&view=diff > >> > >> > ============================================================================== > >> --- > >> > commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java > >> (original) > >> +++ > >> > commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java > >> Sat Mar 2 18:12:46 2013 > >> @@ -507,6 +507,9 @@ public class ListUtils { > >> return -1; > >> } > >> > >> + // partition > >> + > >> > //------------------------------------------------------------------------- > >> + > >> /** > >> * Returns consecutive {@link List#subList(int, int) sublists} of a > >> * list, each of the same size (the final list may be smaller). For > >> example, > >> @@ -579,4 +582,99 @@ public class ListUtils { > >> return list.isEmpty(); > >> } > >> } > >> + > >> + // range > >> + > >> > //------------------------------------------------------------------------- > >> + > >> + /** > >> + * Returns an unmodifiable List of integers in the range [0, size - > >> 1]. > >> + * <p> > >> + * The returned list does not store the actual numbers, but checks > >> + * if a given number would be contained in the defined range. A > call > >> + * to {@link #contains(Object)} is very fast - O(1). > >> + * > >> + * @see #range(int,int) > >> + * > >> + * @param size the size of the returned list > >> + * @return an unmodifiable list of integers in the range [0, size > - 1] > >> + * @throws IllegalArgumentException if from > to > >> + * @since 4.0 > >> + */ > >> + public static List<Integer> range(final int size) { > >> + return range(0, size - 1); > >> + } > >> + > >> + /** > >> + * Returns an unmodifiable List of integers in the range [from, > to]. > >> + * <p> > >> + * The returned list does not store the actual numbers, but checks > >> + * if a given number would be contained in the defined range. A > call > >> + * to {@link #contains(Object)} is very fast - O(1). > >> + * <p> > >> + * The bounds of the range are allowed to be negative. > >> + * > >> + * @param from the start of the range > >> + * @param to the end of the range (inclusive) > >> + * @return an unmodifiable list of integers in the specified range > >> + * @throws IllegalArgumentException if from > to > >> + * @since 4.0 > >> + */ > >> + public static List<Integer> range(final int from, final int to) { > >> + return ListUtils.unmodifiableList(new RangeList(from, to)); > >> + } > >> + > >> + /** > >> + * Provides a memory-efficient implementation of a fixed range > list. > >> + * @since 4.0 > >> + */ > >> + private static final class RangeList extends AbstractList<Integer> > { > >> + private final int from; > >> + private final int to; > >> + > >> + /** > >> + * Creates a list of integers with a given range, inclusive. > >> + * > >> + * @param from the start of the range > >> + * @param to the end of the range (inclusive) > >> + * @throws IllegalArgumentException if from > to > >> + */ > >> + private RangeList(final int from, final int to) { > >> + if (to < from) { > >> + throw new IllegalArgumentException("from(" + from + ") > > > >> to(" + to + ")"); > >> + } > >> + > >> + this.from = from; > >> + this.to = to; > >> + } > >> + > >> + public int size() { > >> + return to - from + 1; > >> + } > >> + > >> + public Integer get(final int index) { > >> + final int sz = size(); > >> + if (index >= sz || index < 0) { > >> + throw new IndexOutOfBoundsException("Index: " + index + > >> ", Size: " + sz); > >> + } > >> + return Integer.valueOf(index + from); > >> + } > >> + > >> + public int indexOf(Object o) { > >> + if (o instanceof Number) { > > > > + final int value = ((Number) o).intValue(); > >> > > > > Why do we cast to Number instead of Integer? > > > > With this implementation the following will fail: > > > > public void testRange() { > > List<Integer> range = ListUtils.range(0, 1); > > assertFalse(range.contains(Double.valueOf(1.2d))); > > } > > because it was like this in the original patch. > I looked at it and found it ok, but it has to be documented in the > contains method that any number passes as argument is converted to int, > which I forgot (still need to commit the unit tests). > > Okay, but even if this was documented it feels strange that 1.2 is contained in [0,1] or am I missing something here? Would be nice to have some unit tests in place.
> Right now, the returned list is not a full-blown Range implementation, > but this maybe a useful addition in the future. > No questions about that! As I commented in the issue, I like this feature! :) > > Thomas > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > > -- http://people.apache.org/~britter/ http://www.systemoutprintln.de/ http://twitter.com/BenediktRitter http://github.com/britter