This is an automated email from the ASF dual-hosted git repository.

garydgregory 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 3e50a7f9c Find NaN in ArrayUtils.lastIndexOf for double and float 
arrays (#1718)
3e50a7f9c is described below

commit 3e50a7f9cf103357d781483d41ec9c9386e69e9d
Author: alhuda <[email protected]>
AuthorDate: Sat Jun 20 16:30:37 2026 +0530

    Find NaN in ArrayUtils.lastIndexOf for double and float arrays (#1718)
    
    * find NaN in ArrayUtils.lastIndexOf for double and float arrays
    
    * Add lastIndexOf tests for positive and negative infinity
---
 .../java/org/apache/commons/lang3/ArrayUtils.java  | 28 +++++++++++++++-
 .../org/apache/commons/lang3/ArrayUtilsTest.java   | 38 ++++++++++++++++++++++
 2 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/commons/lang3/ArrayUtils.java 
b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
index 4b6b2cf0b..3a7dafb80 100644
--- a/src/main/java/org/apache/commons/lang3/ArrayUtils.java
+++ b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
@@ -4265,6 +4265,9 @@ public static int lastIndexOf(final double[] array, final 
double valueToFind, fi
      * @return the last index of the value within the array, {@link 
#INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input.
      */
     public static int lastIndexOf(final double[] array, final double 
valueToFind, int startIndex) {
+        if (Double.isNaN(valueToFind)) {
+            return lastIndexOfNaN(array, startIndex);
+        }
         if (isEmpty(array) || startIndex < 0) {
             return INDEX_NOT_FOUND;
         }
@@ -4296,6 +4299,9 @@ public static int lastIndexOf(final double[] array, final 
double valueToFind, in
      * @return the last index of the value within the array, {@link 
#INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input.
      */
     public static int lastIndexOf(final double[] array, final double 
valueToFind, int startIndex, final double tolerance) {
+        if (Double.isNaN(valueToFind)) {
+            return lastIndexOfNaN(array, startIndex);
+        }
         if (isEmpty(array) || startIndex < 0) {
             return INDEX_NOT_FOUND;
         }
@@ -4347,8 +4353,10 @@ public static int lastIndexOf(final float[] array, final 
float valueToFind, int
         if (startIndex >= array.length) {
             startIndex = array.length - 1;
         }
+        final boolean searchNaN = Float.isNaN(valueToFind);
         for (int i = startIndex; i >= 0; i--) {
-            if (valueToFind == array[i]) {
+            final float element = array[i];
+            if (valueToFind == element || searchNaN && Float.isNaN(element)) {
                 return i;
             }
         }
@@ -4535,6 +4543,24 @@ public static int lastIndexOf(final short[] array, final 
short valueToFind, int
         return INDEX_NOT_FOUND;
     }
 
+    /**
+     * Finds the last index of the NaN value in a double array.
+     * @param array the array to traverse backwards for NaN, may be {@code 
null}.
+     * @param startIndex the start index to traverse backwards from.
+     * @return the last 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 lastIndexOfNaN(final double[] array, final int 
startIndex) {
+        if (isEmpty(array) || startIndex < 0) {
+            return INDEX_NOT_FOUND;
+        }
+        for (int i = Math.min(startIndex, array.length - 1); i >= 0; i--) {
+            if (Double.isNaN(array[i])) {
+                return i;
+            }
+        }
+        return INDEX_NOT_FOUND;
+    }
+
     /**
      * Maps elements from an array into elements of a new array of a given 
type, while mapping old elements to new elements.
      *
diff --git a/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java 
b/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
index a096e949f..b9faef8c4 100644
--- a/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
@@ -1824,6 +1824,27 @@ void testLastIndexOfDouble() {
         assertEquals(-1, ArrayUtils.lastIndexOf(array, 99));
     }
 
+    @Test
+    void testLastIndexOfDoubleNaN() {
+        final double[] array = { Double.NaN, Double.NEGATIVE_INFINITY, 
Double.NaN, Double.POSITIVE_INFINITY };
+        assertEquals(2, ArrayUtils.lastIndexOf(array, Double.NaN));
+        assertEquals(2, ArrayUtils.lastIndexOf(array, Double.NaN, (double) 0));
+        assertEquals(0, ArrayUtils.lastIndexOf(array, Double.NaN, 1));
+        assertEquals(0, ArrayUtils.lastIndexOf(array, Double.NaN, 1, (double) 
0));
+        assertEquals(-1, ArrayUtils.lastIndexOf(array, Double.NaN, -1));
+    }
+
+    @Test
+    void testLastIndexOfDoubleInfinity() {
+        final double[] array = { Double.POSITIVE_INFINITY, 
Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY };
+        assertEquals(2, ArrayUtils.lastIndexOf(array, 
Double.POSITIVE_INFINITY));
+        assertEquals(3, ArrayUtils.lastIndexOf(array, 
Double.NEGATIVE_INFINITY));
+        assertEquals(0, ArrayUtils.lastIndexOf(array, 
Double.POSITIVE_INFINITY, 1));
+        assertEquals(1, ArrayUtils.lastIndexOf(array, 
Double.NEGATIVE_INFINITY, 2));
+        assertEquals(2, ArrayUtils.lastIndexOf(array, 
Double.POSITIVE_INFINITY, array.length, (double) 0));
+        assertEquals(1, ArrayUtils.lastIndexOf(array, 
Double.NEGATIVE_INFINITY, 2, (double) 0));
+    }
+
     @Test
     void testLastIndexOfDoubleTolerance() {
         double[] array = null;
@@ -1884,6 +1905,23 @@ void testLastIndexOfFloat() {
         assertEquals(-1, ArrayUtils.lastIndexOf(array, 99));
     }
 
+    @Test
+    void testLastIndexOfFloatNaN() {
+        final float[] array = { Float.NaN, Float.NEGATIVE_INFINITY, Float.NaN, 
Float.POSITIVE_INFINITY };
+        assertEquals(2, ArrayUtils.lastIndexOf(array, Float.NaN));
+        assertEquals(0, ArrayUtils.lastIndexOf(array, Float.NaN, 1));
+        assertEquals(-1, ArrayUtils.lastIndexOf(array, Float.NaN, -1));
+    }
+
+    @Test
+    void testLastIndexOfFloatInfinity() {
+        final float[] array = { Float.POSITIVE_INFINITY, 
Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY };
+        assertEquals(2, ArrayUtils.lastIndexOf(array, 
Float.POSITIVE_INFINITY));
+        assertEquals(3, ArrayUtils.lastIndexOf(array, 
Float.NEGATIVE_INFINITY));
+        assertEquals(0, ArrayUtils.lastIndexOf(array, Float.POSITIVE_INFINITY, 
1));
+        assertEquals(1, ArrayUtils.lastIndexOf(array, Float.NEGATIVE_INFINITY, 
2));
+    }
+
     @Test
     void testLastIndexOfFloatWithStartIndex() {
         float[] array = null;

Reply via email to