Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 25 additions & 3 deletions src/main/java/org/apache/commons/lang3/ArrayUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand All @@ -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;
}
Expand All @@ -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.
* <p>
Expand Down
10 changes: 9 additions & 1 deletion src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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));
Expand Down
Loading