View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.collections4;
19  
20  /**
21   * <p>
22   * Operations on arrays, primitive arrays (like {@code int[]}) and primitive wrapper arrays (like {@code Integer[]}).
23   * </p>
24   * <p>
25   * This class tries to handle {@code null} input gracefully. An exception will not be thrown for a {@code null} array input. However, an Object array that
26   * contains a {@code null} element may throw an exception. Each method documents its behavior.
27   * </p>
28   * <p>
29   * Package private, might move to an internal package if this needs to be public.
30   * </p>
31   * <p>
32   * #ThreadSafe#
33   * </p>
34   *
35   * @since 4.2 (Copied from Apache Commons Lang.)
36   */
37  final class ArrayUtils {
38  
39      /**
40       * <p>
41       * Checks if the object is in the given array.
42       * </p>
43       * <p>
44       * The method returns {@code false} if a {@code null} array is passed in.
45       * </p>
46       *
47       * @param array        the array to search through
48       * @param objectToFind the object to find
49       * @return {@code true} if the array contains the object
50       */
51      static boolean contains(final Object[] array, final Object objectToFind) {
52          return indexOf(array, objectToFind) != CollectionUtils.INDEX_NOT_FOUND;
53      }
54  
55      /**
56       * <p>
57       * Finds the index of the given object in the array starting at the given index.
58       * </p>
59       * <p>
60       * This method returns {@link CollectionUtils#INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.
61       * </p>
62       * <p>
63       * A negative startIndex is treated as zero. A startIndex larger than the array length will return {@link CollectionUtils#INDEX_NOT_FOUND} ({@code -1}).
64       * </p>
65       *
66       * @param array        the array to search through for the object, may be {@code null}
67       * @param objectToFind the object to find, may be {@code null}
68       * @param startIndex   the index to start searching at
69       * @return the index of the object within the array starting at the index, {@link CollectionUtils#INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null}
70       *         array input
71       */
72      static int indexOf(final Object[] array, final Object objectToFind, int startIndex) {
73          if (array == null) {
74              return CollectionUtils.INDEX_NOT_FOUND;
75          }
76          if (startIndex < 0) {
77              startIndex = 0;
78          }
79          if (objectToFind == null) {
80              for (int i = startIndex; i < array.length; i++) {
81                  if (array[i] == null) {
82                      return i;
83                  }
84              }
85          } else {
86              for (int i = startIndex; i < array.length; i++) {
87                  if (objectToFind.equals(array[i])) {
88                      return i;
89                  }
90              }
91          }
92          return CollectionUtils.INDEX_NOT_FOUND;
93      }
94  
95      /**
96       * <p>
97       * Finds the index of the given object in the array.
98       * </p>
99       * <p>
100      * This method returns {@link CollectionUtils#INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.
101      * </p>
102      *
103      * @param array        the array to search through for the object, may be {@code null}
104      * @param objectToFind the object to find, may be {@code null}
105      * @return the index of the object within the array, {@link CollectionUtils#INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
106      */
107     static <T> int indexOf(final T[] array, final Object objectToFind) {
108         return indexOf(array, objectToFind, 0);
109     }
110 
111     /**
112      * Don't allow instances.
113      */
114     private ArrayUtils() {
115     }
116 
117 }