This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push:
new 52c06bea2 fix LANG-1816 (#1589)
52c06bea2 is described below
commit 52c06bea2f2b6c277c517dc9f5bb0d62d17e073c
Author: Ivan Ponomarev <[email protected]>
AuthorDate: Wed Jan 28 01:25:02 2026 +0000
fix LANG-1816 (#1589)
---
.../java/org/apache/commons/lang3/ArrayUtils.java | 28 +++++++++++++++++++---
.../org/apache/commons/lang3/ArrayUtilsTest.java | 10 +++++++-
2 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/src/main/java/org/apache/commons/lang3/ArrayUtils.java
b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
index 6cd708582..57f9da441 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.
* <p>
diff --git a/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
b/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
index bf3d3d398..a096e949f 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));