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 &gt; 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 &gt; 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 &gt; 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

Reply via email to