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));

Reply via email to