You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2013/03/02 19:12:46 UTC
svn commit: r1451914 -
/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java
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();
+ 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;
+ }
+ }
}
Re: svn commit: r1451914 - /commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java
Posted by Benedikt Ritter <br...@apache.org>.
2013/3/3 Benedikt Ritter <br...@apache.org>
>
>
>
> 2013/3/2 Thomas Neidhart <th...@gmail.com>
>
>> On 03/02/2013 07:33 PM, Benedikt Ritter wrote:
>> > 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 > 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-unsubscribe@commons.apache.org
>> For additional commands, e-mail: dev-help@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
Re: svn commit: r1451914 - /commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java
Posted by Benedikt Ritter <br...@apache.org>.
2013/3/2 Thomas Neidhart <th...@gmail.com>
> On 03/02/2013 07:33 PM, Benedikt Ritter wrote:
> > 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 > 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-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>
--
http://people.apache.org/~britter/
http://www.systemoutprintln.de/
http://twitter.com/BenediktRitter
http://github.com/britter
Re: svn commit: r1451914 - /commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java
Posted by Thomas Neidhart <th...@gmail.com>.
On 03/02/2013 07:33 PM, Benedikt Ritter wrote:
> 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 > 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-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org
Re: svn commit: r1451914 - /commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/ListUtils.java
Posted by Benedikt Ritter <br...@apache.org>.
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 > 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)));
}
> + 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