You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2020/11/14 21:33:41 UTC

[commons-lang] branch master updated: [LANG-1541] ArrayUtils.contains() and indexOf() fails to handle Double.NaN #647.

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 0e2ebd3  [LANG-1541] ArrayUtils.contains() and indexOf() fails to handle Double.NaN #647.
0e2ebd3 is described below

commit 0e2ebd347c4a4afd6c4cf539678d2a23d3df9570
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sat Nov 14 16:33:35 2020 -0500

    [LANG-1541] ArrayUtils.contains() and indexOf() fails to handle
    Double.NaN #647.
    
    Also remove trailing whitespaces.
---
 src/changes/changes.xml                                 |  1 +
 src/main/java/org/apache/commons/lang3/ArrayUtils.java  |  6 ++++--
 .../java/org/apache/commons/lang3/ArrayUtilsTest.java   | 17 +++++++++++++++++
 .../org/apache/commons/lang3/math/NumberUtilsTest.java  |  2 +-
 4 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e80f014..129638d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -56,6 +56,7 @@ The <action> type attribute can be add,update,fix,remove.
     <action issue="LANG-1606" type="update" dev="sebb" due-to="Rustem Galiev">StringUtils.countMatches - clarify Javadoc.</action>
     <action issue="LANG-1591" type="update" dev="kinow" due-to="bhawna94">Remove redundant argument from substring call.</action>
     <action issue="LANG-1613" type="update" dev="ggregory" due-to="Arturo Bernal, Gary Gregory">BigDecimal is created when you pass it the min and max values, #642.</action>
+    <action issue="LANG-1541" type="update" dev="ggregory" due-to="Arturo Bernal, Gary Gregory">ArrayUtils.contains() and indexOf() fails to handle Double.NaN #647.</action>
     <!--  ADDS -->
     <action                   type="add" dev="ggregory" due-to="Gary Gregory">Add BooleanUtils.booleanValues().</action>
     <action                   type="add" dev="ggregory" due-to="Gary Gregory">Add BooleanUtils.primitiveValues().</action>
diff --git a/src/main/java/org/apache/commons/lang3/ArrayUtils.java b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
index 8aeafa7..ccc9698 100644
--- a/src/main/java/org/apache/commons/lang3/ArrayUtils.java
+++ b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
@@ -973,7 +973,7 @@ public class ArrayUtils {
         System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
         return joinedArray;
     }
-    
+
     /**
      * <p>Adds all the elements of the given arrays into a new array.
      * <p>The new array contains all of the element of {@code array1} followed
@@ -2437,8 +2437,10 @@ public class ArrayUtils {
         if (startIndex < 0) {
             startIndex = 0;
         }
+        final boolean searchNaN = Double.isNaN(valueToFind);
         for (int i = startIndex; i < array.length; i++) {
-            if (valueToFind == array[i]) {
+            final double element = array[i];
+            if (valueToFind == element || (searchNaN && Double.isNaN(element))) {
                 return i;
             }
         }
diff --git a/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java b/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
index 2c5a1f6..5b5f889 100644
--- a/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
@@ -276,6 +276,14 @@ public class ArrayUtilsTest {
         assertFalse(ArrayUtils.contains(array, (double) 99));
     }
 
+    @Test
+    public void testContainsDoubleNaN() {
+        double[] a = new double[] { Double.NEGATIVE_INFINITY, Double.NaN, Double.POSITIVE_INFINITY };
+        assertTrue(ArrayUtils.contains(a, Double.POSITIVE_INFINITY));
+        assertTrue(ArrayUtils.contains(a, Double.NEGATIVE_INFINITY));
+        assertTrue(ArrayUtils.contains(a, Double.NaN));
+    }
+
     @SuppressWarnings("cast")
     @Test
     public void testContainsDoubleTolerance() {
@@ -1044,6 +1052,15 @@ public class ArrayUtilsTest {
         assertEquals(-1, ArrayUtils.indexOf(array, (double) 99));
     }
 
+    @Test
+    public void testIndexOfDoubleNaN() {
+        double[] array = new double[] { Double.NEGATIVE_INFINITY, Double.NaN, Double.POSITIVE_INFINITY, Double.NaN };
+        assertEquals(0, ArrayUtils.indexOf(array, Double.NEGATIVE_INFINITY));
+        assertEquals(1, ArrayUtils.indexOf(array, Double.NaN));
+        assertEquals(2, ArrayUtils.indexOf(array, Double.POSITIVE_INFINITY));
+
+    }
+
     @SuppressWarnings("cast")
     @Test
     public void testIndexOfDoubleTolerance() {
diff --git a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
index f1b0423..ec62278 100644
--- a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
@@ -1334,7 +1334,7 @@ public class NumberUtilsTest {
         assertTrue(NumberUtils.createNumber(Double.toString(Double.MAX_VALUE) + "D") instanceof Double);
         assertTrue(NumberUtils.createNumber(Double.toString(Double.MAX_VALUE) + "F") instanceof Double);
         assertTrue(NumberUtils.createNumber("4.9e-324D") instanceof Double);
-        assertTrue(NumberUtils.createNumber("4.9e-324F") instanceof Double);    
+        assertTrue(NumberUtils.createNumber("4.9e-324F") instanceof Double);
     }
 
     /**