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). Right now, the returned list is not a full-blown Range implementation, but this maybe a useful addition in the future. Thomas --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org