Author: tn Date: Mon Jun 22 19:48:47 2015 New Revision: 1686921 URL: http://svn.apache.org/r1686921 Log: Add indexOf methods to IterableUtils and IteratorUtils, replace last occurrence of ArrayStack with ArrayDeque.
Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MapUtils.java commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.java commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IteratorUtilsTest.java Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java?rev=1686921&r1=1686920&r2=1686921&view=diff ============================================================================== --- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java (original) +++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java Mon Jun 22 19:48:47 2015 @@ -613,6 +613,22 @@ public class IterableUtils { } /** + * Returns the index of the first element in the specified iterable that + * matches the given predicate. + * <p> + * A <code>null</code> or empty iterable returns -1. + * + * @param <E> the element type + * @param iterable the iterable to search, may be null + * @param predicate the predicate to use, may not be null + * @return the index of the first element which matches the predicate or -1 if none matches + * @throws NullPointerException if predicate is null + */ + public static <E> int indexOf(final Iterable<E> iterable, final Predicate<? super E> predicate) { + return IteratorUtils.indexOf(emptyIteratorIfNull(iterable), predicate); + } + + /** * Answers true if a predicate is true for every element of an iterable. * <p> * A <code>null</code> or empty iterable returns true. Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java?rev=1686921&r1=1686920&r2=1686921&view=diff ============================================================================== --- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java (original) +++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java Mon Jun 22 19:48:47 2015 @@ -1282,31 +1282,48 @@ public class IteratorUtils { } /** - * Answers true if a predicate is true for any element of the iterator. + * Returns the index of the first element in the specified iterator that + * matches the given predicate. * <p> - * A <code>null</code> or empty iterator returns false. + * A <code>null</code> or empty iterator returns -1. * - * @param <E> the type of object the {@link Iterator} contains - * @param iterator the {@link Iterator} to use, may be null + * @param <E> the element type + * @param iterator the iterator to search, may be null * @param predicate the predicate to use, may not be null - * @return true if any element of the collection matches the predicate, false otherwise + * @return the index of the first element which matches the predicate or -1 if none matches * @throws NullPointerException if predicate is null * @since 4.1 */ - public static <E> boolean matchesAny(final Iterator<E> iterator, final Predicate<? super E> predicate) { + public static <E> int indexOf(final Iterator<E> iterator, final Predicate<? super E> predicate) { if (predicate == null) { throw new NullPointerException("Predicate must not be null"); } if (iterator != null) { - while (iterator.hasNext()) { + for(int index = 0; iterator.hasNext(); index++) { final E element = iterator.next(); if (predicate.evaluate(element)) { - return true; + return index; } } } - return false; + return -1; + } + + /** + * Answers true if a predicate is true for any element of the iterator. + * <p> + * A <code>null</code> or empty iterator returns false. + * + * @param <E> the type of object the {@link Iterator} contains + * @param iterator the {@link Iterator} to use, may be null + * @param predicate the predicate to use, may not be null + * @return true if any element of the collection matches the predicate, false otherwise + * @throws NullPointerException if predicate is null + * @since 4.1 + */ + public static <E> boolean matchesAny(final Iterator<E> iterator, final Predicate<? super E> predicate) { + return indexOf(iterator, predicate) != -1; } /** Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MapUtils.java URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MapUtils.java?rev=1686921&r1=1686920&r2=1686921&view=diff ============================================================================== --- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MapUtils.java (original) +++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/MapUtils.java Mon Jun 22 19:48:47 2015 @@ -19,8 +19,10 @@ package org.apache.commons.collections4; import java.io.PrintStream; import java.text.NumberFormat; import java.text.ParseException; +import java.util.ArrayDeque; import java.util.Collection; import java.util.Collections; +import java.util.Deque; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; @@ -918,7 +920,7 @@ public class MapUtils { * @throws NullPointerException if the stream is <code>null</code> */ public static void verbosePrint(final PrintStream out, final Object label, final Map<?, ?> map) { - verbosePrintInternal(out, label, map, new ArrayStack<Map<?, ?>>(), false); + verbosePrintInternal(out, label, map, new ArrayDeque<Map<?, ?>>(), false); } /** @@ -940,7 +942,7 @@ public class MapUtils { * @throws NullPointerException if the stream is <code>null</code> */ public static void debugPrint(final PrintStream out, final Object label, final Map<?, ?> map) { - verbosePrintInternal(out, label, map, new ArrayStack<Map<?, ?>>(), true); + verbosePrintInternal(out, label, map, new ArrayDeque<Map<?, ?>>(), true); } // Implementation methods @@ -969,7 +971,7 @@ public class MapUtils { * @throws NullPointerException if the stream is <code>null</code> */ private static void verbosePrintInternal(final PrintStream out, final Object label, final Map<?, ?> map, - final ArrayStack<Map<?, ?>> lineage, final boolean debug) { + final Deque<Map<?, ?>> lineage, final boolean debug) { printIndent(out, lineage.size()); if (map == null) { @@ -988,7 +990,7 @@ public class MapUtils { printIndent(out, lineage.size()); out.println("{"); - lineage.push(map); + lineage.addLast(map); for (final Map.Entry<?, ?> entry : map.entrySet()) { final Object childKey = entry.getKey(); @@ -1005,7 +1007,9 @@ public class MapUtils { out.print(childKey); out.print(" = "); - final int lineageIndex = lineage.indexOf(childValue); + final int lineageIndex = + IterableUtils.indexOf(lineage, + PredicateUtils.equalPredicate(childValue)); if (lineageIndex == -1) { out.print(childValue); } else if (lineage.size() - 1 == lineageIndex) { @@ -1026,7 +1030,7 @@ public class MapUtils { } } - lineage.pop(); + lineage.removeLast(); printIndent(out, lineage.size()); out.println(debug ? "} " + map.getClass().getName() : "}"); Modified: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.java URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.java?rev=1686921&r1=1686920&r2=1686921&view=diff ============================================================================== --- commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.java (original) +++ commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.java Mon Jun 22 19:48:47 2015 @@ -293,6 +293,23 @@ public class IterableUtilsTest { } @Test + public void indexOf() { + Predicate<Number> testPredicate = equalPredicate((Number) 4); + int index = IterableUtils.indexOf(iterableA, testPredicate); + assertEquals(6, index); + testPredicate = equalPredicate((Number) 45); + index = IterableUtils.indexOf(iterableA, testPredicate); + assertEquals(-1, index); + assertEquals(-1, IterableUtils.indexOf(null, testPredicate)); + try { + assertNull(IterableUtils.indexOf(iterableA, null)); + fail("expecting NullPointerException"); + } catch (final NullPointerException npe) { + // expected + } + } + + @Test public void countMatches() { assertEquals(4, IterableUtils.countMatches(iterableB, EQUALS_TWO)); assertEquals(0, IterableUtils.countMatches(null, EQUALS_TWO)); Modified: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IteratorUtilsTest.java URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IteratorUtilsTest.java?rev=1686921&r1=1686920&r2=1686921&view=diff ============================================================================== --- commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IteratorUtilsTest.java (original) +++ commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IteratorUtilsTest.java Mon Jun 22 19:48:47 2015 @@ -16,9 +16,16 @@ */ package org.apache.commons.collections4; -import static org.apache.commons.collections4.functors.EqualPredicate.*; -import static org.easymock.EasyMock.*; -import static org.junit.Assert.*; +import static org.apache.commons.collections4.functors.EqualPredicate.equalPredicate; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; @@ -64,7 +71,7 @@ public class IteratorUtilsTest { private Iterable<Integer> iterableA = null; - private Collection<Integer> emptyCollection = new ArrayList<Integer>(1); + private final Collection<Integer> emptyCollection = new ArrayList<Integer>(1); @Before public void setUp() { @@ -908,9 +915,11 @@ public class IteratorUtilsTest { */ private NodeList createNodeList(final Node[] nodes) { return new NodeList() { + @Override public Node item(final int index) { return nodes[index]; } + @Override public int getLength() { return nodes.length; } @@ -957,8 +966,8 @@ public class IteratorUtilsTest { final Comparator<Integer> reverseComparator = ComparatorUtils.reversedComparator(ComparatorUtils.<Integer>naturalComparator()); - Collections.reverse((List<Integer>) collectionOdd); - Collections.reverse((List<Integer>) collectionEven); + Collections.reverse(collectionOdd); + Collections.reverse(collectionEven); Collections.reverse(combinedList); it = IteratorUtils.collatedIterator(reverseComparator, @@ -1043,6 +1052,23 @@ public class IteratorUtilsTest { fail("expecting NullPointerException"); } catch (final NullPointerException npe) { // expected + } + } + + @Test + public void indexOf() { + Predicate<Number> testPredicate = equalPredicate((Number) 4); + int index = IteratorUtils.indexOf(iterableA.iterator(), testPredicate); + assertEquals(6, index); + testPredicate = equalPredicate((Number) 45); + index = IteratorUtils.indexOf(iterableA.iterator(), testPredicate); + assertEquals(-1, index); + assertEquals(-1, IteratorUtils.indexOf(null, testPredicate)); + try { + assertNull(IteratorUtils.indexOf(iterableA.iterator(), null)); + fail("expecting NullPointerException"); + } catch (final NullPointerException npe) { + // expected } }