diff --git a/src/main/java/org/apache/commons/lang3/ArrayUtils.java b/src/main/java/org/apache/commons/lang3/ArrayUtils.java index 6cd708582f0..57f9da441b3 100644 --- a/src/main/java/org/apache/commons/lang3/ArrayUtils.java +++ b/src/main/java/org/apache/commons/lang3/ArrayUtils.java @@ -2830,13 +2830,14 @@ public static int indexOf(final double[] array, final double valueToFind, final * @return the index of the value within the array, {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input. */ public static int indexOf(final double[] array, final double valueToFind, final int startIndex) { + if (Double.isNaN(valueToFind)) { + return indexOfNaN(array, startIndex); + } if (isEmpty(array)) { return INDEX_NOT_FOUND; } - final boolean searchNaN = Double.isNaN(valueToFind); for (int i = max0(startIndex); i < array.length; i++) { - final double element = array[i]; - if (valueToFind == element || searchNaN && Double.isNaN(element)) { + if (valueToFind == array[i]) { return i; } } @@ -2860,6 +2861,9 @@ public static int indexOf(final double[] array, final double valueToFind, final * @return the index of the value within the array, {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input. */ public static int indexOf(final double[] array, final double valueToFind, final int startIndex, final double tolerance) { + if (Double.isNaN(valueToFind)) { + return indexOfNaN(array, startIndex); + } if (isEmpty(array)) { return INDEX_NOT_FOUND; } @@ -2873,6 +2877,24 @@ public static int indexOf(final double[] array, final double valueToFind, final return INDEX_NOT_FOUND; } + /** + * Finds the index of the NaN value in a double array. + * @param array the array to search for NaN, may be {@code null}. + * @param startIndex the index to start searching. + * @return the index of the NaN value within the array, {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input. + */ + private static int indexOfNaN(final double[] array, final int startIndex) { + if (isEmpty(array)) { + return INDEX_NOT_FOUND; + } + for (int i = max0(startIndex); i < array.length; i++) { + if (Double.isNaN(array[i])) { + return i; + } + } + return INDEX_NOT_FOUND; + } + /** * Finds the index of the given value in the array. *

diff --git a/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java b/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java index bf3d3d398f8..a096e949fff 100644 --- a/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java @@ -362,6 +362,10 @@ void testContainsDoubleNaN() { assertTrue(ArrayUtils.contains(a, Double.POSITIVE_INFINITY)); assertTrue(ArrayUtils.contains(a, Double.NEGATIVE_INFINITY)); assertTrue(ArrayUtils.contains(a, Double.NaN)); + + assertTrue(ArrayUtils.contains(a, Double.POSITIVE_INFINITY, 0.1)); + assertTrue(ArrayUtils.contains(a, Double.NEGATIVE_INFINITY, 0.1)); + assertTrue(ArrayUtils.contains(a, Double.NaN, 0.1)); } @Test @@ -1135,17 +1139,21 @@ void testIndexOfDouble() { void testIndexOfDoubleNaN() { final double[] array = { Double.NEGATIVE_INFINITY, Double.NaN, Double.POSITIVE_INFINITY, Double.NaN }; assertEquals(0, ArrayUtils.indexOf(array, Double.NEGATIVE_INFINITY)); + assertEquals(0, ArrayUtils.indexOf(array, Double.NEGATIVE_INFINITY, (double) 0)); assertEquals(1, ArrayUtils.indexOf(array, Double.NaN)); + assertEquals(1, ArrayUtils.indexOf(array, Double.NaN, (double) 0)); assertEquals(2, ArrayUtils.indexOf(array, Double.POSITIVE_INFINITY)); - + assertEquals(2, ArrayUtils.indexOf(array, Double.POSITIVE_INFINITY, (double) 0)); } @Test void testIndexOfDoubleTolerance() { double[] array = null; assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, (double) 0)); + assertEquals(-1, ArrayUtils.indexOf(array, Double.NaN, (double) 0)); array = new double[0]; assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, (double) 0)); + assertEquals(-1, ArrayUtils.indexOf(array, Double.NaN, (double) 0)); array = new double[]{0, 1, 2, 3, 0}; assertEquals(0, ArrayUtils.indexOf(array, 0, 0.3)); assertEquals(2, ArrayUtils.indexOf(array, 2.2, 0.35));