2013/3/3 Benedikt Ritter <brit...@apache.org> > > > > 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? >
Thomas, can you please comment on this? I don't understand why 1.2 should be contained in [0,1] or is this a result of the incomplete implementation and will be changed? TIA! Benedikt > 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 > -- http://people.apache.org/~britter/ http://www.systemoutprintln.de/ http://twitter.com/BenediktRitter http://github.com/britter