commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Benedikt Ritter <brit...@apache.org>
Subject Re: svn commit: r1451914 - /commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java
Date Sat, 02 Mar 2013 18:33:37 GMT
2013/3/2 <tn@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)));
    }


> +                if (value >= from && value <= to) {
> +                    return value - from;
> +                }
> +            }
> +            return -1;
> +        }
> +
> +        public int lastIndexOf(Object o) {
> +            return indexOf(o);
> +        }
> +
> +        public boolean contains(Object o) {
> +            return indexOf(o) != -1;
> +        }
> +    }
>  }
>
>
>


-- 
http://people.apache.org/~britter/
http://www.systemoutprintln.de/
http://twitter.com/BenediktRitter
http://github.com/britter

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message