source: src/main/java/agents/org/apache/commons/lang/ArrayUtils.java

Last change on this file was 127, checked in by Wouter Pasman, 6 years ago

#41 ROLL BACK of rev.126 . So this version is equal to rev. 125

File size: 195.9 KB
Line 
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 */
17package agents.org.apache.commons.lang;
18
19import java.lang.reflect.Array;
20import java.util.HashMap;
21import java.util.Map;
22
23import agents.org.apache.commons.lang.builder.EqualsBuilder;
24import agents.org.apache.commons.lang.builder.HashCodeBuilder;
25import agents.org.apache.commons.lang.builder.ToStringBuilder;
26import agents.org.apache.commons.lang.builder.ToStringStyle;
27
28/**
29 * <p>Operations on arrays, primitive arrays (like <code>int[]</code>) and
30 * primitive wrapper arrays (like <code>Integer[]</code>).</p>
31 *
32 * <p>This class tries to handle <code>null</code> input gracefully.
33 * An exception will not be thrown for a <code>null</code>
34 * array input. However, an Object array that contains a <code>null</code>
35 * element may throw an exception. Each method documents its behaviour.</p>
36 *
37 * <p>#ThreadSafe#</p>
38 * @author Apache Software Foundation
39 * @author Moritz Petersen
40 * @author <a href="mailto:fredrik@westermarck.com">Fredrik Westermarck</a>
41 * @author Nikolay Metchev
42 * @author Matthew Hawthorne
43 * @author Tim O'Brien
44 * @author Pete Gieser
45 * @author Gary Gregory
46 * @author <a href="mailto:equinus100@hotmail.com">Ashwin S</a>
47 * @author Maarten Coene
48 * @since 2.0
49 * @version $Id: ArrayUtils.java 1056988 2011-01-09 17:58:53Z niallp $
50 */
51public class ArrayUtils {
52
53 /**
54 * An empty immutable <code>Object</code> array.
55 */
56 public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
57 /**
58 * An empty immutable <code>Class</code> array.
59 */
60 public static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
61 /**
62 * An empty immutable <code>String</code> array.
63 */
64 public static final String[] EMPTY_STRING_ARRAY = new String[0];
65 /**
66 * An empty immutable <code>long</code> array.
67 */
68 public static final long[] EMPTY_LONG_ARRAY = new long[0];
69 /**
70 * An empty immutable <code>Long</code> array.
71 */
72 public static final Long[] EMPTY_LONG_OBJECT_ARRAY = new Long[0];
73 /**
74 * An empty immutable <code>int</code> array.
75 */
76 public static final int[] EMPTY_INT_ARRAY = new int[0];
77 /**
78 * An empty immutable <code>Integer</code> array.
79 */
80 public static final Integer[] EMPTY_INTEGER_OBJECT_ARRAY = new Integer[0];
81 /**
82 * An empty immutable <code>short</code> array.
83 */
84 public static final short[] EMPTY_SHORT_ARRAY = new short[0];
85 /**
86 * An empty immutable <code>Short</code> array.
87 */
88 public static final Short[] EMPTY_SHORT_OBJECT_ARRAY = new Short[0];
89 /**
90 * An empty immutable <code>byte</code> array.
91 */
92 public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
93 /**
94 * An empty immutable <code>Byte</code> array.
95 */
96 public static final Byte[] EMPTY_BYTE_OBJECT_ARRAY = new Byte[0];
97 /**
98 * An empty immutable <code>double</code> array.
99 */
100 public static final double[] EMPTY_DOUBLE_ARRAY = new double[0];
101 /**
102 * An empty immutable <code>Double</code> array.
103 */
104 public static final Double[] EMPTY_DOUBLE_OBJECT_ARRAY = new Double[0];
105 /**
106 * An empty immutable <code>float</code> array.
107 */
108 public static final float[] EMPTY_FLOAT_ARRAY = new float[0];
109 /**
110 * An empty immutable <code>Float</code> array.
111 */
112 public static final Float[] EMPTY_FLOAT_OBJECT_ARRAY = new Float[0];
113 /**
114 * An empty immutable <code>boolean</code> array.
115 */
116 public static final boolean[] EMPTY_BOOLEAN_ARRAY = new boolean[0];
117 /**
118 * An empty immutable <code>Boolean</code> array.
119 */
120 public static final Boolean[] EMPTY_BOOLEAN_OBJECT_ARRAY = new Boolean[0];
121 /**
122 * An empty immutable <code>char</code> array.
123 */
124 public static final char[] EMPTY_CHAR_ARRAY = new char[0];
125 /**
126 * An empty immutable <code>Character</code> array.
127 */
128 public static final Character[] EMPTY_CHARACTER_OBJECT_ARRAY = new Character[0];
129
130 /**
131 * The index value when an element is not found in a list or array: <code>-1</code>.
132 * This value is returned by methods in this class and can also be used in comparisons with values returned by
133 * various method from {@link java.util.List}.
134 */
135 public static final int INDEX_NOT_FOUND = -1;
136
137 /**
138 * <p>ArrayUtils instances should NOT be constructed in standard programming.
139 * Instead, the class should be used as <code>ArrayUtils.clone(new int[] {2})</code>.</p>
140 *
141 * <p>This constructor is public to permit tools that require a JavaBean instance
142 * to operate.</p>
143 */
144 public ArrayUtils() {
145 super();
146 }
147
148 // Basic methods handling multi-dimensional arrays
149 //-----------------------------------------------------------------------
150 /**
151 * <p>Outputs an array as a String, treating <code>null</code> as an empty array.</p>
152 *
153 * <p>Multi-dimensional arrays are handled correctly, including
154 * multi-dimensional primitive arrays.</p>
155 *
156 * <p>The format is that of Java source code, for example <code>{a,b}</code>.</p>
157 *
158 * @param array the array to get a toString for, may be <code>null</code>
159 * @return a String representation of the array, '{}' if null array input
160 */
161 public static String toString(Object array) {
162 return toString(array, "{}");
163 }
164
165 /**
166 * <p>Outputs an array as a String handling <code>null</code>s.</p>
167 *
168 * <p>Multi-dimensional arrays are handled correctly, including
169 * multi-dimensional primitive arrays.</p>
170 *
171 * <p>The format is that of Java source code, for example <code>{a,b}</code>.</p>
172 *
173 * @param array the array to get a toString for, may be <code>null</code>
174 * @param stringIfNull the String to return if the array is <code>null</code>
175 * @return a String representation of the array
176 */
177 public static String toString(Object array, String stringIfNull) {
178 if (array == null) {
179 return stringIfNull;
180 }
181 return new ToStringBuilder(array, ToStringStyle.SIMPLE_STYLE).append(array).toString();
182 }
183
184 /**
185 * <p>Get a hashCode for an array handling multi-dimensional arrays correctly.</p>
186 *
187 * <p>Multi-dimensional primitive arrays are also handled correctly by this method.</p>
188 *
189 * @param array the array to get a hashCode for, may be <code>null</code>
190 * @return a hashCode for the array, zero if null array input
191 */
192 public static int hashCode(Object array) {
193 return new HashCodeBuilder().append(array).toHashCode();
194 }
195
196 /**
197 * <p>Compares two arrays, using equals(), handling multi-dimensional arrays
198 * correctly.</p>
199 *
200 * <p>Multi-dimensional primitive arrays are also handled correctly by this method.</p>
201 *
202 * @param array1 the left hand array to compare, may be <code>null</code>
203 * @param array2 the right hand array to compare, may be <code>null</code>
204 * @return <code>true</code> if the arrays are equal
205 */
206 public static boolean isEquals(Object array1, Object array2) {
207 return new EqualsBuilder().append(array1, array2).isEquals();
208 }
209
210 // To map
211 //-----------------------------------------------------------------------
212 /**
213 * <p>Converts the given array into a {@link java.util.Map}. Each element of the array
214 * must be either a {@link java.util.Map.Entry} or an Array, containing at least two
215 * elements, where the first element is used as key and the second as
216 * value.</p>
217 *
218 * <p>This method can be used to initialize:</p>
219 * <pre>
220 * // Create a Map mapping colors.
221 * Map colorMap = MapUtils.toMap(new String[][] {{
222 * {"RED", "#FF0000"},
223 * {"GREEN", "#00FF00"},
224 * {"BLUE", "#0000FF"}});
225 * </pre>
226 *
227 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
228 *
229 * @param array an array whose elements are either a {@link java.util.Map.Entry} or
230 * an Array containing at least two elements, may be <code>null</code>
231 * @return a <code>Map</code> that was created from the array
232 * @throws IllegalArgumentException if one element of this Array is
233 * itself an Array containing less then two elements
234 * @throws IllegalArgumentException if the array contains elements other
235 * than {@link java.util.Map.Entry} and an Array
236 */
237 public static Map toMap(Object[] array) {
238 if (array == null) {
239 return null;
240 }
241 final Map map = new HashMap((int) (array.length * 1.5));
242 for (int i = 0; i < array.length; i++) {
243 Object object = array[i];
244 if (object instanceof Map.Entry) {
245 Map.Entry entry = (Map.Entry) object;
246 map.put(entry.getKey(), entry.getValue());
247 } else if (object instanceof Object[]) {
248 Object[] entry = (Object[]) object;
249 if (entry.length < 2) {
250 throw new IllegalArgumentException("Array element " + i + ", '"
251 + object
252 + "', has a length less than 2");
253 }
254 map.put(entry[0], entry[1]);
255 } else {
256 throw new IllegalArgumentException("Array element " + i + ", '"
257 + object
258 + "', is neither of type Map.Entry nor an Array");
259 }
260 }
261 return map;
262 }
263
264 // Clone
265 //-----------------------------------------------------------------------
266 /**
267 * <p>Shallow clones an array returning a typecast result and handling
268 * <code>null</code>.</p>
269 *
270 * <p>The objects in the array are not cloned, thus there is no special
271 * handling for multi-dimensional arrays.</p>
272 *
273 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
274 *
275 * @param array the array to shallow clone, may be <code>null</code>
276 * @return the cloned array, <code>null</code> if <code>null</code> input
277 */
278 public static Object[] clone(Object[] array) {
279 if (array == null) {
280 return null;
281 }
282 return (Object[]) array.clone();
283 }
284
285 /**
286 * <p>Clones an array returning a typecast result and handling
287 * <code>null</code>.</p>
288 *
289 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
290 *
291 * @param array the array to clone, may be <code>null</code>
292 * @return the cloned array, <code>null</code> if <code>null</code> input
293 */
294 public static long[] clone(long[] array) {
295 if (array == null) {
296 return null;
297 }
298 return (long[]) array.clone();
299 }
300
301 /**
302 * <p>Clones an array returning a typecast result and handling
303 * <code>null</code>.</p>
304 *
305 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
306 *
307 * @param array the array to clone, may be <code>null</code>
308 * @return the cloned array, <code>null</code> if <code>null</code> input
309 */
310 public static int[] clone(int[] array) {
311 if (array == null) {
312 return null;
313 }
314 return (int[]) array.clone();
315 }
316
317 /**
318 * <p>Clones an array returning a typecast result and handling
319 * <code>null</code>.</p>
320 *
321 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
322 *
323 * @param array the array to clone, may be <code>null</code>
324 * @return the cloned array, <code>null</code> if <code>null</code> input
325 */
326 public static short[] clone(short[] array) {
327 if (array == null) {
328 return null;
329 }
330 return (short[]) array.clone();
331 }
332
333 /**
334 * <p>Clones an array returning a typecast result and handling
335 * <code>null</code>.</p>
336 *
337 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
338 *
339 * @param array the array to clone, may be <code>null</code>
340 * @return the cloned array, <code>null</code> if <code>null</code> input
341 */
342 public static char[] clone(char[] array) {
343 if (array == null) {
344 return null;
345 }
346 return (char[]) array.clone();
347 }
348
349 /**
350 * <p>Clones an array returning a typecast result and handling
351 * <code>null</code>.</p>
352 *
353 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
354 *
355 * @param array the array to clone, may be <code>null</code>
356 * @return the cloned array, <code>null</code> if <code>null</code> input
357 */
358 public static byte[] clone(byte[] array) {
359 if (array == null) {
360 return null;
361 }
362 return (byte[]) array.clone();
363 }
364
365 /**
366 * <p>Clones an array returning a typecast result and handling
367 * <code>null</code>.</p>
368 *
369 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
370 *
371 * @param array the array to clone, may be <code>null</code>
372 * @return the cloned array, <code>null</code> if <code>null</code> input
373 */
374 public static double[] clone(double[] array) {
375 if (array == null) {
376 return null;
377 }
378 return (double[]) array.clone();
379 }
380
381 /**
382 * <p>Clones an array returning a typecast result and handling
383 * <code>null</code>.</p>
384 *
385 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
386 *
387 * @param array the array to clone, may be <code>null</code>
388 * @return the cloned array, <code>null</code> if <code>null</code> input
389 */
390 public static float[] clone(float[] array) {
391 if (array == null) {
392 return null;
393 }
394 return (float[]) array.clone();
395 }
396
397 /**
398 * <p>Clones an array returning a typecast result and handling
399 * <code>null</code>.</p>
400 *
401 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
402 *
403 * @param array the array to clone, may be <code>null</code>
404 * @return the cloned array, <code>null</code> if <code>null</code> input
405 */
406 public static boolean[] clone(boolean[] array) {
407 if (array == null) {
408 return null;
409 }
410 return (boolean[]) array.clone();
411 }
412
413 // nullToEmpty
414 //-----------------------------------------------------------------------
415 /**
416 * <p>Defensive programming technique to change a <code>null</code>
417 * reference to an empty one.</p>
418 *
419 * <p>This method returns an empty array for a <code>null</code> input array.</p>
420 *
421 * <p>As a memory optimizing technique an empty array passed in will be overridden with
422 * the empty <code>public static</code> references in this class.</p>
423 *
424 * @param array the array to check for <code>null</code> or empty
425 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
426 * @since 2.5
427 */
428 public static Object[] nullToEmpty(Object[] array) {
429 if (array == null || array.length == 0) {
430 return EMPTY_OBJECT_ARRAY;
431 }
432 return array;
433 }
434
435 /**
436 * <p>Defensive programming technique to change a <code>null</code>
437 * reference to an empty one.</p>
438 *
439 * <p>This method returns an empty array for a <code>null</code> input array.</p>
440 *
441 * <p>As a memory optimizing technique an empty array passed in will be overridden with
442 * the empty <code>public static</code> references in this class.</p>
443 *
444 * @param array the array to check for <code>null</code> or empty
445 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
446 * @since 2.5
447 */
448 public static String[] nullToEmpty(String[] array) {
449 if (array == null || array.length == 0) {
450 return EMPTY_STRING_ARRAY;
451 }
452 return array;
453 }
454
455 /**
456 * <p>Defensive programming technique to change a <code>null</code>
457 * reference to an empty one.</p>
458 *
459 * <p>This method returns an empty array for a <code>null</code> input array.</p>
460 *
461 * <p>As a memory optimizing technique an empty array passed in will be overridden with
462 * the empty <code>public static</code> references in this class.</p>
463 *
464 * @param array the array to check for <code>null</code> or empty
465 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
466 * @since 2.5
467 */
468 public static long[] nullToEmpty(long[] array) {
469 if (array == null || array.length == 0) {
470 return EMPTY_LONG_ARRAY;
471 }
472 return array;
473 }
474
475 /**
476 * <p>Defensive programming technique to change a <code>null</code>
477 * reference to an empty one.</p>
478 *
479 * <p>This method returns an empty array for a <code>null</code> input array.</p>
480 *
481 * <p>As a memory optimizing technique an empty array passed in will be overridden with
482 * the empty <code>public static</code> references in this class.</p>
483 *
484 * @param array the array to check for <code>null</code> or empty
485 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
486 * @since 2.5
487 */
488 public static int[] nullToEmpty(int[] array) {
489 if (array == null || array.length == 0) {
490 return EMPTY_INT_ARRAY;
491 }
492 return array;
493 }
494
495 /**
496 * <p>Defensive programming technique to change a <code>null</code>
497 * reference to an empty one.</p>
498 *
499 * <p>This method returns an empty array for a <code>null</code> input array.</p>
500 *
501 * <p>As a memory optimizing technique an empty array passed in will be overridden with
502 * the empty <code>public static</code> references in this class.</p>
503 *
504 * @param array the array to check for <code>null</code> or empty
505 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
506 * @since 2.5
507 */
508 public static short[] nullToEmpty(short[] array) {
509 if (array == null || array.length == 0) {
510 return EMPTY_SHORT_ARRAY;
511 }
512 return array;
513 }
514
515 /**
516 * <p>Defensive programming technique to change a <code>null</code>
517 * reference to an empty one.</p>
518 *
519 * <p>This method returns an empty array for a <code>null</code> input array.</p>
520 *
521 * <p>As a memory optimizing technique an empty array passed in will be overridden with
522 * the empty <code>public static</code> references in this class.</p>
523 *
524 * @param array the array to check for <code>null</code> or empty
525 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
526 * @since 2.5
527 */
528 public static char[] nullToEmpty(char[] array) {
529 if (array == null || array.length == 0) {
530 return EMPTY_CHAR_ARRAY;
531 }
532 return array;
533 }
534
535 /**
536 * <p>Defensive programming technique to change a <code>null</code>
537 * reference to an empty one.</p>
538 *
539 * <p>This method returns an empty array for a <code>null</code> input array.</p>
540 *
541 * <p>As a memory optimizing technique an empty array passed in will be overridden with
542 * the empty <code>public static</code> references in this class.</p>
543 *
544 * @param array the array to check for <code>null</code> or empty
545 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
546 * @since 2.5
547 */
548 public static byte[] nullToEmpty(byte[] array) {
549 if (array == null || array.length == 0) {
550 return EMPTY_BYTE_ARRAY;
551 }
552 return array;
553 }
554
555 /**
556 * <p>Defensive programming technique to change a <code>null</code>
557 * reference to an empty one.</p>
558 *
559 * <p>This method returns an empty array for a <code>null</code> input array.</p>
560 *
561 * <p>As a memory optimizing technique an empty array passed in will be overridden with
562 * the empty <code>public static</code> references in this class.</p>
563 *
564 * @param array the array to check for <code>null</code> or empty
565 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
566 * @since 2.5
567 */
568 public static double[] nullToEmpty(double[] array) {
569 if (array == null || array.length == 0) {
570 return EMPTY_DOUBLE_ARRAY;
571 }
572 return array;
573 }
574
575 /**
576 * <p>Defensive programming technique to change a <code>null</code>
577 * reference to an empty one.</p>
578 *
579 * <p>This method returns an empty array for a <code>null</code> input array.</p>
580 *
581 * <p>As a memory optimizing technique an empty array passed in will be overridden with
582 * the empty <code>public static</code> references in this class.</p>
583 *
584 * @param array the array to check for <code>null</code> or empty
585 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
586 * @since 2.5
587 */
588 public static float[] nullToEmpty(float[] array) {
589 if (array == null || array.length == 0) {
590 return EMPTY_FLOAT_ARRAY;
591 }
592 return array;
593 }
594
595 /**
596 * <p>Defensive programming technique to change a <code>null</code>
597 * reference to an empty one.</p>
598 *
599 * <p>This method returns an empty array for a <code>null</code> input array.</p>
600 *
601 * <p>As a memory optimizing technique an empty array passed in will be overridden with
602 * the empty <code>public static</code> references in this class.</p>
603 *
604 * @param array the array to check for <code>null</code> or empty
605 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
606 * @since 2.5
607 */
608 public static boolean[] nullToEmpty(boolean[] array) {
609 if (array == null || array.length == 0) {
610 return EMPTY_BOOLEAN_ARRAY;
611 }
612 return array;
613 }
614
615 /**
616 * <p>Defensive programming technique to change a <code>null</code>
617 * reference to an empty one.</p>
618 *
619 * <p>This method returns an empty array for a <code>null</code> input array.</p>
620 *
621 * <p>As a memory optimizing technique an empty array passed in will be overridden with
622 * the empty <code>public static</code> references in this class.</p>
623 *
624 * @param array the array to check for <code>null</code> or empty
625 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
626 * @since 2.5
627 */
628 public static Long[] nullToEmpty(Long[] array) {
629 if (array == null || array.length == 0) {
630 return EMPTY_LONG_OBJECT_ARRAY;
631 }
632 return array;
633 }
634
635 /**
636 * <p>Defensive programming technique to change a <code>null</code>
637 * reference to an empty one.</p>
638 *
639 * <p>This method returns an empty array for a <code>null</code> input array.</p>
640 *
641 * <p>As a memory optimizing technique an empty array passed in will be overridden with
642 * the empty <code>public static</code> references in this class.</p>
643 *
644 * @param array the array to check for <code>null</code> or empty
645 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
646 * @since 2.5
647 */
648 public static Integer[] nullToEmpty(Integer[] array) {
649 if (array == null || array.length == 0) {
650 return EMPTY_INTEGER_OBJECT_ARRAY;
651 }
652 return array;
653 }
654
655 /**
656 * <p>Defensive programming technique to change a <code>null</code>
657 * reference to an empty one.</p>
658 *
659 * <p>This method returns an empty array for a <code>null</code> input array.</p>
660 *
661 * <p>As a memory optimizing technique an empty array passed in will be overridden with
662 * the empty <code>public static</code> references in this class.</p>
663 *
664 * @param array the array to check for <code>null</code> or empty
665 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
666 * @since 2.5
667 */
668 public static Short[] nullToEmpty(Short[] array) {
669 if (array == null || array.length == 0) {
670 return EMPTY_SHORT_OBJECT_ARRAY;
671 }
672 return array;
673 }
674
675 /**
676 * <p>Defensive programming technique to change a <code>null</code>
677 * reference to an empty one.</p>
678 *
679 * <p>This method returns an empty array for a <code>null</code> input array.</p>
680 *
681 * <p>As a memory optimizing technique an empty array passed in will be overridden with
682 * the empty <code>public static</code> references in this class.</p>
683 *
684 * @param array the array to check for <code>null</code> or empty
685 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
686 * @since 2.5
687 */
688 public static Character[] nullToEmpty(Character[] array) {
689 if (array == null || array.length == 0) {
690 return EMPTY_CHARACTER_OBJECT_ARRAY;
691 }
692 return array;
693 }
694
695 /**
696 * <p>Defensive programming technique to change a <code>null</code>
697 * reference to an empty one.</p>
698 *
699 * <p>This method returns an empty array for a <code>null</code> input array.</p>
700 *
701 * <p>As a memory optimizing technique an empty array passed in will be overridden with
702 * the empty <code>public static</code> references in this class.</p>
703 *
704 * @param array the array to check for <code>null</code> or empty
705 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
706 * @since 2.5
707 */
708 public static Byte[] nullToEmpty(Byte[] array) {
709 if (array == null || array.length == 0) {
710 return EMPTY_BYTE_OBJECT_ARRAY;
711 }
712 return array;
713 }
714
715 /**
716 * <p>Defensive programming technique to change a <code>null</code>
717 * reference to an empty one.</p>
718 *
719 * <p>This method returns an empty array for a <code>null</code> input array.</p>
720 *
721 * <p>As a memory optimizing technique an empty array passed in will be overridden with
722 * the empty <code>public static</code> references in this class.</p>
723 *
724 * @param array the array to check for <code>null</code> or empty
725 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
726 * @since 2.5
727 */
728 public static Double[] nullToEmpty(Double[] array) {
729 if (array == null || array.length == 0) {
730 return EMPTY_DOUBLE_OBJECT_ARRAY;
731 }
732 return array;
733 }
734
735 /**
736 * <p>Defensive programming technique to change a <code>null</code>
737 * reference to an empty one.</p>
738 *
739 * <p>This method returns an empty array for a <code>null</code> input array.</p>
740 *
741 * <p>As a memory optimizing technique an empty array passed in will be overridden with
742 * the empty <code>public static</code> references in this class.</p>
743 *
744 * @param array the array to check for <code>null</code> or empty
745 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
746 * @since 2.5
747 */
748 public static Float[] nullToEmpty(Float[] array) {
749 if (array == null || array.length == 0) {
750 return EMPTY_FLOAT_OBJECT_ARRAY;
751 }
752 return array;
753 }
754
755 /**
756 * <p>Defensive programming technique to change a <code>null</code>
757 * reference to an empty one.</p>
758 *
759 * <p>This method returns an empty array for a <code>null</code> input array.</p>
760 *
761 * <p>As a memory optimizing technique an empty array passed in will be overridden with
762 * the empty <code>public static</code> references in this class.</p>
763 *
764 * @param array the array to check for <code>null</code> or empty
765 * @return the same array, <code>public static</code> empty array if <code>null</code> or empty input
766 * @since 2.5
767 */
768 public static Boolean[] nullToEmpty(Boolean[] array) {
769 if (array == null || array.length == 0) {
770 return EMPTY_BOOLEAN_OBJECT_ARRAY;
771 }
772 return array;
773 }
774
775 // Subarrays
776 //-----------------------------------------------------------------------
777 /**
778 * <p>Produces a new array containing the elements between
779 * the start and end indices.</p>
780 *
781 * <p>The start index is inclusive, the end index exclusive.
782 * Null array input produces null output.</p>
783 *
784 * <p>The component type of the subarray is always the same as
785 * that of the input array. Thus, if the input is an array of type
786 * <code>Date</code>, the following usage is envisaged:</p>
787 *
788 * <pre>
789 * Date[] someDates = (Date[])ArrayUtils.subarray(allDates, 2, 5);
790 * </pre>
791 *
792 * @param array the array
793 * @param startIndexInclusive the starting index. Undervalue (&lt;0)
794 * is promoted to 0, overvalue (&gt;array.length) results
795 * in an empty array.
796 * @param endIndexExclusive elements up to endIndex-1 are present in the
797 * returned subarray. Undervalue (&lt; startIndex) produces
798 * empty array, overvalue (&gt;array.length) is demoted to
799 * array length.
800 * @return a new array containing the elements between
801 * the start and end indices.
802 * @since 2.1
803 */
804 public static Object[] subarray(Object[] array, int startIndexInclusive, int endIndexExclusive) {
805 if (array == null) {
806 return null;
807 }
808 if (startIndexInclusive < 0) {
809 startIndexInclusive = 0;
810 }
811 if (endIndexExclusive > array.length) {
812 endIndexExclusive = array.length;
813 }
814 int newSize = endIndexExclusive - startIndexInclusive;
815 Class type = array.getClass().getComponentType();
816 if (newSize <= 0) {
817 return (Object[]) Array.newInstance(type, 0);
818 }
819 Object[] subarray = (Object[]) Array.newInstance(type, newSize);
820 System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
821 return subarray;
822 }
823
824 /**
825 * <p>Produces a new <code>long</code> array containing the elements
826 * between the start and end indices.</p>
827 *
828 * <p>The start index is inclusive, the end index exclusive.
829 * Null array input produces null output.</p>
830 *
831 * @param array the array
832 * @param startIndexInclusive the starting index. Undervalue (&lt;0)
833 * is promoted to 0, overvalue (&gt;array.length) results
834 * in an empty array.
835 * @param endIndexExclusive elements up to endIndex-1 are present in the
836 * returned subarray. Undervalue (&lt; startIndex) produces
837 * empty array, overvalue (&gt;array.length) is demoted to
838 * array length.
839 * @return a new array containing the elements between
840 * the start and end indices.
841 * @since 2.1
842 */
843 public static long[] subarray(long[] array, int startIndexInclusive, int endIndexExclusive) {
844 if (array == null) {
845 return null;
846 }
847 if (startIndexInclusive < 0) {
848 startIndexInclusive = 0;
849 }
850 if (endIndexExclusive > array.length) {
851 endIndexExclusive = array.length;
852 }
853 int newSize = endIndexExclusive - startIndexInclusive;
854 if (newSize <= 0) {
855 return EMPTY_LONG_ARRAY;
856 }
857
858 long[] subarray = new long[newSize];
859 System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
860 return subarray;
861 }
862
863 /**
864 * <p>Produces a new <code>int</code> array containing the elements
865 * between the start and end indices.</p>
866 *
867 * <p>The start index is inclusive, the end index exclusive.
868 * Null array input produces null output.</p>
869 *
870 * @param array the array
871 * @param startIndexInclusive the starting index. Undervalue (&lt;0)
872 * is promoted to 0, overvalue (&gt;array.length) results
873 * in an empty array.
874 * @param endIndexExclusive elements up to endIndex-1 are present in the
875 * returned subarray. Undervalue (&lt; startIndex) produces
876 * empty array, overvalue (&gt;array.length) is demoted to
877 * array length.
878 * @return a new array containing the elements between
879 * the start and end indices.
880 * @since 2.1
881 */
882 public static int[] subarray(int[] array, int startIndexInclusive, int endIndexExclusive) {
883 if (array == null) {
884 return null;
885 }
886 if (startIndexInclusive < 0) {
887 startIndexInclusive = 0;
888 }
889 if (endIndexExclusive > array.length) {
890 endIndexExclusive = array.length;
891 }
892 int newSize = endIndexExclusive - startIndexInclusive;
893 if (newSize <= 0) {
894 return EMPTY_INT_ARRAY;
895 }
896
897 int[] subarray = new int[newSize];
898 System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
899 return subarray;
900 }
901
902 /**
903 * <p>Produces a new <code>short</code> array containing the elements
904 * between the start and end indices.</p>
905 *
906 * <p>The start index is inclusive, the end index exclusive.
907 * Null array input produces null output.</p>
908 *
909 * @param array the array
910 * @param startIndexInclusive the starting index. Undervalue (&lt;0)
911 * is promoted to 0, overvalue (&gt;array.length) results
912 * in an empty array.
913 * @param endIndexExclusive elements up to endIndex-1 are present in the
914 * returned subarray. Undervalue (&lt; startIndex) produces
915 * empty array, overvalue (&gt;array.length) is demoted to
916 * array length.
917 * @return a new array containing the elements between
918 * the start and end indices.
919 * @since 2.1
920 */
921 public static short[] subarray(short[] array, int startIndexInclusive, int endIndexExclusive) {
922 if (array == null) {
923 return null;
924 }
925 if (startIndexInclusive < 0) {
926 startIndexInclusive = 0;
927 }
928 if (endIndexExclusive > array.length) {
929 endIndexExclusive = array.length;
930 }
931 int newSize = endIndexExclusive - startIndexInclusive;
932 if (newSize <= 0) {
933 return EMPTY_SHORT_ARRAY;
934 }
935
936 short[] subarray = new short[newSize];
937 System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
938 return subarray;
939 }
940
941 /**
942 * <p>Produces a new <code>char</code> array containing the elements
943 * between the start and end indices.</p>
944 *
945 * <p>The start index is inclusive, the end index exclusive.
946 * Null array input produces null output.</p>
947 *
948 * @param array the array
949 * @param startIndexInclusive the starting index. Undervalue (&lt;0)
950 * is promoted to 0, overvalue (&gt;array.length) results
951 * in an empty array.
952 * @param endIndexExclusive elements up to endIndex-1 are present in the
953 * returned subarray. Undervalue (&lt; startIndex) produces
954 * empty array, overvalue (&gt;array.length) is demoted to
955 * array length.
956 * @return a new array containing the elements between
957 * the start and end indices.
958 * @since 2.1
959 */
960 public static char[] subarray(char[] array, int startIndexInclusive, int endIndexExclusive) {
961 if (array == null) {
962 return null;
963 }
964 if (startIndexInclusive < 0) {
965 startIndexInclusive = 0;
966 }
967 if (endIndexExclusive > array.length) {
968 endIndexExclusive = array.length;
969 }
970 int newSize = endIndexExclusive - startIndexInclusive;
971 if (newSize <= 0) {
972 return EMPTY_CHAR_ARRAY;
973 }
974
975 char[] subarray = new char[newSize];
976 System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
977 return subarray;
978 }
979
980 /**
981 * <p>Produces a new <code>byte</code> array containing the elements
982 * between the start and end indices.</p>
983 *
984 * <p>The start index is inclusive, the end index exclusive.
985 * Null array input produces null output.</p>
986 *
987 * @param array the array
988 * @param startIndexInclusive the starting index. Undervalue (&lt;0)
989 * is promoted to 0, overvalue (&gt;array.length) results
990 * in an empty array.
991 * @param endIndexExclusive elements up to endIndex-1 are present in the
992 * returned subarray. Undervalue (&lt; startIndex) produces
993 * empty array, overvalue (&gt;array.length) is demoted to
994 * array length.
995 * @return a new array containing the elements between
996 * the start and end indices.
997 * @since 2.1
998 */
999 public static byte[] subarray(byte[] array, int startIndexInclusive, int endIndexExclusive) {
1000 if (array == null) {
1001 return null;
1002 }
1003 if (startIndexInclusive < 0) {
1004 startIndexInclusive = 0;
1005 }
1006 if (endIndexExclusive > array.length) {
1007 endIndexExclusive = array.length;
1008 }
1009 int newSize = endIndexExclusive - startIndexInclusive;
1010 if (newSize <= 0) {
1011 return EMPTY_BYTE_ARRAY;
1012 }
1013
1014 byte[] subarray = new byte[newSize];
1015 System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
1016 return subarray;
1017 }
1018
1019 /**
1020 * <p>Produces a new <code>double</code> array containing the elements
1021 * between the start and end indices.</p>
1022 *
1023 * <p>The start index is inclusive, the end index exclusive.
1024 * Null array input produces null output.</p>
1025 *
1026 * @param array the array
1027 * @param startIndexInclusive the starting index. Undervalue (&lt;0)
1028 * is promoted to 0, overvalue (&gt;array.length) results
1029 * in an empty array.
1030 * @param endIndexExclusive elements up to endIndex-1 are present in the
1031 * returned subarray. Undervalue (&lt; startIndex) produces
1032 * empty array, overvalue (&gt;array.length) is demoted to
1033 * array length.
1034 * @return a new array containing the elements between
1035 * the start and end indices.
1036 * @since 2.1
1037 */
1038 public static double[] subarray(double[] array, int startIndexInclusive, int endIndexExclusive) {
1039 if (array == null) {
1040 return null;
1041 }
1042 if (startIndexInclusive < 0) {
1043 startIndexInclusive = 0;
1044 }
1045 if (endIndexExclusive > array.length) {
1046 endIndexExclusive = array.length;
1047 }
1048 int newSize = endIndexExclusive - startIndexInclusive;
1049 if (newSize <= 0) {
1050 return EMPTY_DOUBLE_ARRAY;
1051 }
1052
1053 double[] subarray = new double[newSize];
1054 System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
1055 return subarray;
1056 }
1057
1058 /**
1059 * <p>Produces a new <code>float</code> array containing the elements
1060 * between the start and end indices.</p>
1061 *
1062 * <p>The start index is inclusive, the end index exclusive.
1063 * Null array input produces null output.</p>
1064 *
1065 * @param array the array
1066 * @param startIndexInclusive the starting index. Undervalue (&lt;0)
1067 * is promoted to 0, overvalue (&gt;array.length) results
1068 * in an empty array.
1069 * @param endIndexExclusive elements up to endIndex-1 are present in the
1070 * returned subarray. Undervalue (&lt; startIndex) produces
1071 * empty array, overvalue (&gt;array.length) is demoted to
1072 * array length.
1073 * @return a new array containing the elements between
1074 * the start and end indices.
1075 * @since 2.1
1076 */
1077 public static float[] subarray(float[] array, int startIndexInclusive, int endIndexExclusive) {
1078 if (array == null) {
1079 return null;
1080 }
1081 if (startIndexInclusive < 0) {
1082 startIndexInclusive = 0;
1083 }
1084 if (endIndexExclusive > array.length) {
1085 endIndexExclusive = array.length;
1086 }
1087 int newSize = endIndexExclusive - startIndexInclusive;
1088 if (newSize <= 0) {
1089 return EMPTY_FLOAT_ARRAY;
1090 }
1091
1092 float[] subarray = new float[newSize];
1093 System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
1094 return subarray;
1095 }
1096
1097 /**
1098 * <p>Produces a new <code>boolean</code> array containing the elements
1099 * between the start and end indices.</p>
1100 *
1101 * <p>The start index is inclusive, the end index exclusive.
1102 * Null array input produces null output.</p>
1103 *
1104 * @param array the array
1105 * @param startIndexInclusive the starting index. Undervalue (&lt;0)
1106 * is promoted to 0, overvalue (&gt;array.length) results
1107 * in an empty array.
1108 * @param endIndexExclusive elements up to endIndex-1 are present in the
1109 * returned subarray. Undervalue (&lt; startIndex) produces
1110 * empty array, overvalue (&gt;array.length) is demoted to
1111 * array length.
1112 * @return a new array containing the elements between
1113 * the start and end indices.
1114 * @since 2.1
1115 */
1116 public static boolean[] subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive) {
1117 if (array == null) {
1118 return null;
1119 }
1120 if (startIndexInclusive < 0) {
1121 startIndexInclusive = 0;
1122 }
1123 if (endIndexExclusive > array.length) {
1124 endIndexExclusive = array.length;
1125 }
1126 int newSize = endIndexExclusive - startIndexInclusive;
1127 if (newSize <= 0) {
1128 return EMPTY_BOOLEAN_ARRAY;
1129 }
1130
1131 boolean[] subarray = new boolean[newSize];
1132 System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
1133 return subarray;
1134 }
1135
1136 // Is same length
1137 //-----------------------------------------------------------------------
1138 /**
1139 * <p>Checks whether two arrays are the same length, treating
1140 * <code>null</code> arrays as length <code>0</code>.
1141 *
1142 * <p>Any multi-dimensional aspects of the arrays are ignored.</p>
1143 *
1144 * @param array1 the first array, may be <code>null</code>
1145 * @param array2 the second array, may be <code>null</code>
1146 * @return <code>true</code> if length of arrays matches, treating
1147 * <code>null</code> as an empty array
1148 */
1149 public static boolean isSameLength(Object[] array1, Object[] array2) {
1150 if ((array1 == null && array2 != null && array2.length > 0) ||
1151 (array2 == null && array1 != null && array1.length > 0) ||
1152 (array1 != null && array2 != null && array1.length != array2.length)) {
1153 return false;
1154 }
1155 return true;
1156 }
1157
1158 /**
1159 * <p>Checks whether two arrays are the same length, treating
1160 * <code>null</code> arrays as length <code>0</code>.</p>
1161 *
1162 * @param array1 the first array, may be <code>null</code>
1163 * @param array2 the second array, may be <code>null</code>
1164 * @return <code>true</code> if length of arrays matches, treating
1165 * <code>null</code> as an empty array
1166 */
1167 public static boolean isSameLength(long[] array1, long[] array2) {
1168 if ((array1 == null && array2 != null && array2.length > 0) ||
1169 (array2 == null && array1 != null && array1.length > 0) ||
1170 (array1 != null && array2 != null && array1.length != array2.length)) {
1171 return false;
1172 }
1173 return true;
1174 }
1175
1176 /**
1177 * <p>Checks whether two arrays are the same length, treating
1178 * <code>null</code> arrays as length <code>0</code>.</p>
1179 *
1180 * @param array1 the first array, may be <code>null</code>
1181 * @param array2 the second array, may be <code>null</code>
1182 * @return <code>true</code> if length of arrays matches, treating
1183 * <code>null</code> as an empty array
1184 */
1185 public static boolean isSameLength(int[] array1, int[] array2) {
1186 if ((array1 == null && array2 != null && array2.length > 0) ||
1187 (array2 == null && array1 != null && array1.length > 0) ||
1188 (array1 != null && array2 != null && array1.length != array2.length)) {
1189 return false;
1190 }
1191 return true;
1192 }
1193
1194 /**
1195 * <p>Checks whether two arrays are the same length, treating
1196 * <code>null</code> arrays as length <code>0</code>.</p>
1197 *
1198 * @param array1 the first array, may be <code>null</code>
1199 * @param array2 the second array, may be <code>null</code>
1200 * @return <code>true</code> if length of arrays matches, treating
1201 * <code>null</code> as an empty array
1202 */
1203 public static boolean isSameLength(short[] array1, short[] array2) {
1204 if ((array1 == null && array2 != null && array2.length > 0) ||
1205 (array2 == null && array1 != null && array1.length > 0) ||
1206 (array1 != null && array2 != null && array1.length != array2.length)) {
1207 return false;
1208 }
1209 return true;
1210 }
1211
1212 /**
1213 * <p>Checks whether two arrays are the same length, treating
1214 * <code>null</code> arrays as length <code>0</code>.</p>
1215 *
1216 * @param array1 the first array, may be <code>null</code>
1217 * @param array2 the second array, may be <code>null</code>
1218 * @return <code>true</code> if length of arrays matches, treating
1219 * <code>null</code> as an empty array
1220 */
1221 public static boolean isSameLength(char[] array1, char[] array2) {
1222 if ((array1 == null && array2 != null && array2.length > 0) ||
1223 (array2 == null && array1 != null && array1.length > 0) ||
1224 (array1 != null && array2 != null && array1.length != array2.length)) {
1225 return false;
1226 }
1227 return true;
1228 }
1229
1230 /**
1231 * <p>Checks whether two arrays are the same length, treating
1232 * <code>null</code> arrays as length <code>0</code>.</p>
1233 *
1234 * @param array1 the first array, may be <code>null</code>
1235 * @param array2 the second array, may be <code>null</code>
1236 * @return <code>true</code> if length of arrays matches, treating
1237 * <code>null</code> as an empty array
1238 */
1239 public static boolean isSameLength(byte[] array1, byte[] array2) {
1240 if ((array1 == null && array2 != null && array2.length > 0) ||
1241 (array2 == null && array1 != null && array1.length > 0) ||
1242 (array1 != null && array2 != null && array1.length != array2.length)) {
1243 return false;
1244 }
1245 return true;
1246 }
1247
1248 /**
1249 * <p>Checks whether two arrays are the same length, treating
1250 * <code>null</code> arrays as length <code>0</code>.</p>
1251 *
1252 * @param array1 the first array, may be <code>null</code>
1253 * @param array2 the second array, may be <code>null</code>
1254 * @return <code>true</code> if length of arrays matches, treating
1255 * <code>null</code> as an empty array
1256 */
1257 public static boolean isSameLength(double[] array1, double[] array2) {
1258 if ((array1 == null && array2 != null && array2.length > 0) ||
1259 (array2 == null && array1 != null && array1.length > 0) ||
1260 (array1 != null && array2 != null && array1.length != array2.length)) {
1261 return false;
1262 }
1263 return true;
1264 }
1265
1266 /**
1267 * <p>Checks whether two arrays are the same length, treating
1268 * <code>null</code> arrays as length <code>0</code>.</p>
1269 *
1270 * @param array1 the first array, may be <code>null</code>
1271 * @param array2 the second array, may be <code>null</code>
1272 * @return <code>true</code> if length of arrays matches, treating
1273 * <code>null</code> as an empty array
1274 */
1275 public static boolean isSameLength(float[] array1, float[] array2) {
1276 if ((array1 == null && array2 != null && array2.length > 0) ||
1277 (array2 == null && array1 != null && array1.length > 0) ||
1278 (array1 != null && array2 != null && array1.length != array2.length)) {
1279 return false;
1280 }
1281 return true;
1282 }
1283
1284 /**
1285 * <p>Checks whether two arrays are the same length, treating
1286 * <code>null</code> arrays as length <code>0</code>.</p>
1287 *
1288 * @param array1 the first array, may be <code>null</code>
1289 * @param array2 the second array, may be <code>null</code>
1290 * @return <code>true</code> if length of arrays matches, treating
1291 * <code>null</code> as an empty array
1292 */
1293 public static boolean isSameLength(boolean[] array1, boolean[] array2) {
1294 if ((array1 == null && array2 != null && array2.length > 0) ||
1295 (array2 == null && array1 != null && array1.length > 0) ||
1296 (array1 != null && array2 != null && array1.length != array2.length)) {
1297 return false;
1298 }
1299 return true;
1300 }
1301
1302 //-----------------------------------------------------------------------
1303 /**
1304 * <p>Returns the length of the specified array.
1305 * This method can deal with <code>Object</code> arrays and with primitive arrays.</p>
1306 *
1307 * <p>If the input array is <code>null</code>, <code>0</code> is returned.</p>
1308 *
1309 * <pre>
1310 * ArrayUtils.getLength(null) = 0
1311 * ArrayUtils.getLength([]) = 0
1312 * ArrayUtils.getLength([null]) = 1
1313 * ArrayUtils.getLength([true, false]) = 2
1314 * ArrayUtils.getLength([1, 2, 3]) = 3
1315 * ArrayUtils.getLength(["a", "b", "c"]) = 3
1316 * </pre>
1317 *
1318 * @param array the array to retrieve the length from, may be null
1319 * @return The length of the array, or <code>0</code> if the array is <code>null</code>
1320 * @throws IllegalArgumentException if the object arguement is not an array.
1321 * @since 2.1
1322 */
1323 public static int getLength(Object array) {
1324 if (array == null) {
1325 return 0;
1326 }
1327 return Array.getLength(array);
1328 }
1329
1330 /**
1331 * <p>Checks whether two arrays are the same type taking into account
1332 * multi-dimensional arrays.</p>
1333 *
1334 * @param array1 the first array, must not be <code>null</code>
1335 * @param array2 the second array, must not be <code>null</code>
1336 * @return <code>true</code> if type of arrays matches
1337 * @throws IllegalArgumentException if either array is <code>null</code>
1338 */
1339 public static boolean isSameType(Object array1, Object array2) {
1340 if (array1 == null || array2 == null) {
1341 throw new IllegalArgumentException("The Array must not be null");
1342 }
1343 return array1.getClass().getName().equals(array2.getClass().getName());
1344 }
1345
1346 // Reverse
1347 //-----------------------------------------------------------------------
1348 /**
1349 * <p>Reverses the order of the given array.</p>
1350 *
1351 * <p>There is no special handling for multi-dimensional arrays.</p>
1352 *
1353 * <p>This method does nothing for a <code>null</code> input array.</p>
1354 *
1355 * @param array the array to reverse, may be <code>null</code>
1356 */
1357 public static void reverse(Object[] array) {
1358 if (array == null) {
1359 return;
1360 }
1361 int i = 0;
1362 int j = array.length - 1;
1363 Object tmp;
1364 while (j > i) {
1365 tmp = array[j];
1366 array[j] = array[i];
1367 array[i] = tmp;
1368 j--;
1369 i++;
1370 }
1371 }
1372
1373 /**
1374 * <p>Reverses the order of the given array.</p>
1375 *
1376 * <p>This method does nothing for a <code>null</code> input array.</p>
1377 *
1378 * @param array the array to reverse, may be <code>null</code>
1379 */
1380 public static void reverse(long[] array) {
1381 if (array == null) {
1382 return;
1383 }
1384 int i = 0;
1385 int j = array.length - 1;
1386 long tmp;
1387 while (j > i) {
1388 tmp = array[j];
1389 array[j] = array[i];
1390 array[i] = tmp;
1391 j--;
1392 i++;
1393 }
1394 }
1395
1396 /**
1397 * <p>Reverses the order of the given array.</p>
1398 *
1399 * <p>This method does nothing for a <code>null</code> input array.</p>
1400 *
1401 * @param array the array to reverse, may be <code>null</code>
1402 */
1403 public static void reverse(int[] array) {
1404 if (array == null) {
1405 return;
1406 }
1407 int i = 0;
1408 int j = array.length - 1;
1409 int tmp;
1410 while (j > i) {
1411 tmp = array[j];
1412 array[j] = array[i];
1413 array[i] = tmp;
1414 j--;
1415 i++;
1416 }
1417 }
1418
1419 /**
1420 * <p>Reverses the order of the given array.</p>
1421 *
1422 * <p>This method does nothing for a <code>null</code> input array.</p>
1423 *
1424 * @param array the array to reverse, may be <code>null</code>
1425 */
1426 public static void reverse(short[] array) {
1427 if (array == null) {
1428 return;
1429 }
1430 int i = 0;
1431 int j = array.length - 1;
1432 short tmp;
1433 while (j > i) {
1434 tmp = array[j];
1435 array[j] = array[i];
1436 array[i] = tmp;
1437 j--;
1438 i++;
1439 }
1440 }
1441
1442 /**
1443 * <p>Reverses the order of the given array.</p>
1444 *
1445 * <p>This method does nothing for a <code>null</code> input array.</p>
1446 *
1447 * @param array the array to reverse, may be <code>null</code>
1448 */
1449 public static void reverse(char[] array) {
1450 if (array == null) {
1451 return;
1452 }
1453 int i = 0;
1454 int j = array.length - 1;
1455 char tmp;
1456 while (j > i) {
1457 tmp = array[j];
1458 array[j] = array[i];
1459 array[i] = tmp;
1460 j--;
1461 i++;
1462 }
1463 }
1464
1465 /**
1466 * <p>Reverses the order of the given array.</p>
1467 *
1468 * <p>This method does nothing for a <code>null</code> input array.</p>
1469 *
1470 * @param array the array to reverse, may be <code>null</code>
1471 */
1472 public static void reverse(byte[] array) {
1473 if (array == null) {
1474 return;
1475 }
1476 int i = 0;
1477 int j = array.length - 1;
1478 byte tmp;
1479 while (j > i) {
1480 tmp = array[j];
1481 array[j] = array[i];
1482 array[i] = tmp;
1483 j--;
1484 i++;
1485 }
1486 }
1487
1488 /**
1489 * <p>Reverses the order of the given array.</p>
1490 *
1491 * <p>This method does nothing for a <code>null</code> input array.</p>
1492 *
1493 * @param array the array to reverse, may be <code>null</code>
1494 */
1495 public static void reverse(double[] array) {
1496 if (array == null) {
1497 return;
1498 }
1499 int i = 0;
1500 int j = array.length - 1;
1501 double tmp;
1502 while (j > i) {
1503 tmp = array[j];
1504 array[j] = array[i];
1505 array[i] = tmp;
1506 j--;
1507 i++;
1508 }
1509 }
1510
1511 /**
1512 * <p>Reverses the order of the given array.</p>
1513 *
1514 * <p>This method does nothing for a <code>null</code> input array.</p>
1515 *
1516 * @param array the array to reverse, may be <code>null</code>
1517 */
1518 public static void reverse(float[] array) {
1519 if (array == null) {
1520 return;
1521 }
1522 int i = 0;
1523 int j = array.length - 1;
1524 float tmp;
1525 while (j > i) {
1526 tmp = array[j];
1527 array[j] = array[i];
1528 array[i] = tmp;
1529 j--;
1530 i++;
1531 }
1532 }
1533
1534 /**
1535 * <p>Reverses the order of the given array.</p>
1536 *
1537 * <p>This method does nothing for a <code>null</code> input array.</p>
1538 *
1539 * @param array the array to reverse, may be <code>null</code>
1540 */
1541 public static void reverse(boolean[] array) {
1542 if (array == null) {
1543 return;
1544 }
1545 int i = 0;
1546 int j = array.length - 1;
1547 boolean tmp;
1548 while (j > i) {
1549 tmp = array[j];
1550 array[j] = array[i];
1551 array[i] = tmp;
1552 j--;
1553 i++;
1554 }
1555 }
1556
1557 // IndexOf search
1558 // ----------------------------------------------------------------------
1559
1560 // Object IndexOf
1561 //-----------------------------------------------------------------------
1562 /**
1563 * <p>Finds the index of the given object in the array.</p>
1564 *
1565 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1566 *
1567 * @param array the array to search through for the object, may be <code>null</code>
1568 * @param objectToFind the object to find, may be <code>null</code>
1569 * @return the index of the object within the array,
1570 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1571 */
1572 public static int indexOf(Object[] array, Object objectToFind) {
1573 return indexOf(array, objectToFind, 0);
1574 }
1575
1576 /**
1577 * <p>Finds the index of the given object in the array starting at the given index.</p>
1578 *
1579 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1580 *
1581 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
1582 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
1583 *
1584 * @param array the array to search through for the object, may be <code>null</code>
1585 * @param objectToFind the object to find, may be <code>null</code>
1586 * @param startIndex the index to start searching at
1587 * @return the index of the object within the array starting at the index,
1588 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1589 */
1590 public static int indexOf(Object[] array, Object objectToFind, int startIndex) {
1591 if (array == null) {
1592 return INDEX_NOT_FOUND;
1593 }
1594 if (startIndex < 0) {
1595 startIndex = 0;
1596 }
1597 if (objectToFind == null) {
1598 for (int i = startIndex; i < array.length; i++) {
1599 if (array[i] == null) {
1600 return i;
1601 }
1602 }
1603 } else if (array.getClass().getComponentType().isInstance(objectToFind)) {
1604 for (int i = startIndex; i < array.length; i++) {
1605 if (objectToFind.equals(array[i])) {
1606 return i;
1607 }
1608 }
1609 }
1610 return INDEX_NOT_FOUND;
1611 }
1612
1613 /**
1614 * <p>Finds the last index of the given object within the array.</p>
1615 *
1616 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1617 *
1618 * @param array the array to travers backwords looking for the object, may be <code>null</code>
1619 * @param objectToFind the object to find, may be <code>null</code>
1620 * @return the last index of the object within the array,
1621 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1622 */
1623 public static int lastIndexOf(Object[] array, Object objectToFind) {
1624 return lastIndexOf(array, objectToFind, Integer.MAX_VALUE);
1625 }
1626
1627 /**
1628 * <p>Finds the last index of the given object in the array starting at the given index.</p>
1629 *
1630 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1631 *
1632 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than
1633 * the array length will search from the end of the array.</p>
1634 *
1635 * @param array the array to traverse for looking for the object, may be <code>null</code>
1636 * @param objectToFind the object to find, may be <code>null</code>
1637 * @param startIndex the start index to travers backwards from
1638 * @return the last index of the object within the array,
1639 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1640 */
1641 public static int lastIndexOf(Object[] array, Object objectToFind, int startIndex) {
1642 if (array == null) {
1643 return INDEX_NOT_FOUND;
1644 }
1645 if (startIndex < 0) {
1646 return INDEX_NOT_FOUND;
1647 } else if (startIndex >= array.length) {
1648 startIndex = array.length - 1;
1649 }
1650 if (objectToFind == null) {
1651 for (int i = startIndex; i >= 0; i--) {
1652 if (array[i] == null) {
1653 return i;
1654 }
1655 }
1656 } else if (array.getClass().getComponentType().isInstance(objectToFind)) {
1657 for (int i = startIndex; i >= 0; i--) {
1658 if (objectToFind.equals(array[i])) {
1659 return i;
1660 }
1661 }
1662 }
1663 return INDEX_NOT_FOUND;
1664 }
1665
1666 /**
1667 * <p>Checks if the object is in the given array.</p>
1668 *
1669 * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
1670 *
1671 * @param array the array to search through
1672 * @param objectToFind the object to find
1673 * @return <code>true</code> if the array contains the object
1674 */
1675 public static boolean contains(Object[] array, Object objectToFind) {
1676 return indexOf(array, objectToFind) != INDEX_NOT_FOUND;
1677 }
1678
1679 // long IndexOf
1680 //-----------------------------------------------------------------------
1681 /**
1682 * <p>Finds the index of the given value in the array.</p>
1683 *
1684 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1685 *
1686 * @param array the array to search through for the object, may be <code>null</code>
1687 * @param valueToFind the value to find
1688 * @return the index of the value within the array,
1689 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1690 */
1691 public static int indexOf(long[] array, long valueToFind) {
1692 return indexOf(array, valueToFind, 0);
1693 }
1694
1695 /**
1696 * <p>Finds the index of the given value in the array starting at the given index.</p>
1697 *
1698 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1699 *
1700 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
1701 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
1702 *
1703 * @param array the array to search through for the object, may be <code>null</code>
1704 * @param valueToFind the value to find
1705 * @param startIndex the index to start searching at
1706 * @return the index of the value within the array,
1707 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1708 */
1709 public static int indexOf(long[] array, long valueToFind, int startIndex) {
1710 if (array == null) {
1711 return INDEX_NOT_FOUND;
1712 }
1713 if (startIndex < 0) {
1714 startIndex = 0;
1715 }
1716 for (int i = startIndex; i < array.length; i++) {
1717 if (valueToFind == array[i]) {
1718 return i;
1719 }
1720 }
1721 return INDEX_NOT_FOUND;
1722 }
1723
1724 /**
1725 * <p>Finds the last index of the given value within the array.</p>
1726 *
1727 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1728 *
1729 * @param array the array to travers backwords looking for the object, may be <code>null</code>
1730 * @param valueToFind the object to find
1731 * @return the last index of the value within the array,
1732 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1733 */
1734 public static int lastIndexOf(long[] array, long valueToFind) {
1735 return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
1736 }
1737
1738 /**
1739 * <p>Finds the last index of the given value in the array starting at the given index.</p>
1740 *
1741 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1742 *
1743 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
1744 * array length will search from the end of the array.</p>
1745 *
1746 * @param array the array to traverse for looking for the object, may be <code>null</code>
1747 * @param valueToFind the value to find
1748 * @param startIndex the start index to travers backwards from
1749 * @return the last index of the value within the array,
1750 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1751 */
1752 public static int lastIndexOf(long[] array, long valueToFind, int startIndex) {
1753 if (array == null) {
1754 return INDEX_NOT_FOUND;
1755 }
1756 if (startIndex < 0) {
1757 return INDEX_NOT_FOUND;
1758 } else if (startIndex >= array.length) {
1759 startIndex = array.length - 1;
1760 }
1761 for (int i = startIndex; i >= 0; i--) {
1762 if (valueToFind == array[i]) {
1763 return i;
1764 }
1765 }
1766 return INDEX_NOT_FOUND;
1767 }
1768
1769 /**
1770 * <p>Checks if the value is in the given array.</p>
1771 *
1772 * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
1773 *
1774 * @param array the array to search through
1775 * @param valueToFind the value to find
1776 * @return <code>true</code> if the array contains the object
1777 */
1778 public static boolean contains(long[] array, long valueToFind) {
1779 return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
1780 }
1781
1782 // int IndexOf
1783 //-----------------------------------------------------------------------
1784 /**
1785 * <p>Finds the index of the given value in the array.</p>
1786 *
1787 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1788 *
1789 * @param array the array to search through for the object, may be <code>null</code>
1790 * @param valueToFind the value to find
1791 * @return the index of the value within the array,
1792 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1793 */
1794 public static int indexOf(int[] array, int valueToFind) {
1795 return indexOf(array, valueToFind, 0);
1796 }
1797
1798 /**
1799 * <p>Finds the index of the given value in the array starting at the given index.</p>
1800 *
1801 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1802 *
1803 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
1804 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
1805 *
1806 * @param array the array to search through for the object, may be <code>null</code>
1807 * @param valueToFind the value to find
1808 * @param startIndex the index to start searching at
1809 * @return the index of the value within the array,
1810 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1811 */
1812 public static int indexOf(int[] array, int valueToFind, int startIndex) {
1813 if (array == null) {
1814 return INDEX_NOT_FOUND;
1815 }
1816 if (startIndex < 0) {
1817 startIndex = 0;
1818 }
1819 for (int i = startIndex; i < array.length; i++) {
1820 if (valueToFind == array[i]) {
1821 return i;
1822 }
1823 }
1824 return INDEX_NOT_FOUND;
1825 }
1826
1827 /**
1828 * <p>Finds the last index of the given value within the array.</p>
1829 *
1830 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1831 *
1832 * @param array the array to travers backwords looking for the object, may be <code>null</code>
1833 * @param valueToFind the object to find
1834 * @return the last index of the value within the array,
1835 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1836 */
1837 public static int lastIndexOf(int[] array, int valueToFind) {
1838 return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
1839 }
1840
1841 /**
1842 * <p>Finds the last index of the given value in the array starting at the given index.</p>
1843 *
1844 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1845 *
1846 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
1847 * array length will search from the end of the array.</p>
1848 *
1849 * @param array the array to traverse for looking for the object, may be <code>null</code>
1850 * @param valueToFind the value to find
1851 * @param startIndex the start index to travers backwards from
1852 * @return the last index of the value within the array,
1853 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1854 */
1855 public static int lastIndexOf(int[] array, int valueToFind, int startIndex) {
1856 if (array == null) {
1857 return INDEX_NOT_FOUND;
1858 }
1859 if (startIndex < 0) {
1860 return INDEX_NOT_FOUND;
1861 } else if (startIndex >= array.length) {
1862 startIndex = array.length - 1;
1863 }
1864 for (int i = startIndex; i >= 0; i--) {
1865 if (valueToFind == array[i]) {
1866 return i;
1867 }
1868 }
1869 return INDEX_NOT_FOUND;
1870 }
1871
1872 /**
1873 * <p>Checks if the value is in the given array.</p>
1874 *
1875 * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
1876 *
1877 * @param array the array to search through
1878 * @param valueToFind the value to find
1879 * @return <code>true</code> if the array contains the object
1880 */
1881 public static boolean contains(int[] array, int valueToFind) {
1882 return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
1883 }
1884
1885 // short IndexOf
1886 //-----------------------------------------------------------------------
1887 /**
1888 * <p>Finds the index of the given value in the array.</p>
1889 *
1890 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1891 *
1892 * @param array the array to search through for the object, may be <code>null</code>
1893 * @param valueToFind the value to find
1894 * @return the index of the value within the array,
1895 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1896 */
1897 public static int indexOf(short[] array, short valueToFind) {
1898 return indexOf(array, valueToFind, 0);
1899 }
1900
1901 /**
1902 * <p>Finds the index of the given value in the array starting at the given index.</p>
1903 *
1904 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1905 *
1906 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
1907 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
1908 *
1909 * @param array the array to search through for the object, may be <code>null</code>
1910 * @param valueToFind the value to find
1911 * @param startIndex the index to start searching at
1912 * @return the index of the value within the array,
1913 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1914 */
1915 public static int indexOf(short[] array, short valueToFind, int startIndex) {
1916 if (array == null) {
1917 return INDEX_NOT_FOUND;
1918 }
1919 if (startIndex < 0) {
1920 startIndex = 0;
1921 }
1922 for (int i = startIndex; i < array.length; i++) {
1923 if (valueToFind == array[i]) {
1924 return i;
1925 }
1926 }
1927 return INDEX_NOT_FOUND;
1928 }
1929
1930 /**
1931 * <p>Finds the last index of the given value within the array.</p>
1932 *
1933 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1934 *
1935 * @param array the array to travers backwords looking for the object, may be <code>null</code>
1936 * @param valueToFind the object to find
1937 * @return the last index of the value within the array,
1938 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1939 */
1940 public static int lastIndexOf(short[] array, short valueToFind) {
1941 return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
1942 }
1943
1944 /**
1945 * <p>Finds the last index of the given value in the array starting at the given index.</p>
1946 *
1947 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1948 *
1949 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
1950 * array length will search from the end of the array.</p>
1951 *
1952 * @param array the array to traverse for looking for the object, may be <code>null</code>
1953 * @param valueToFind the value to find
1954 * @param startIndex the start index to travers backwards from
1955 * @return the last index of the value within the array,
1956 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1957 */
1958 public static int lastIndexOf(short[] array, short valueToFind, int startIndex) {
1959 if (array == null) {
1960 return INDEX_NOT_FOUND;
1961 }
1962 if (startIndex < 0) {
1963 return INDEX_NOT_FOUND;
1964 } else if (startIndex >= array.length) {
1965 startIndex = array.length - 1;
1966 }
1967 for (int i = startIndex; i >= 0; i--) {
1968 if (valueToFind == array[i]) {
1969 return i;
1970 }
1971 }
1972 return INDEX_NOT_FOUND;
1973 }
1974
1975 /**
1976 * <p>Checks if the value is in the given array.</p>
1977 *
1978 * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
1979 *
1980 * @param array the array to search through
1981 * @param valueToFind the value to find
1982 * @return <code>true</code> if the array contains the object
1983 */
1984 public static boolean contains(short[] array, short valueToFind) {
1985 return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
1986 }
1987
1988 // char IndexOf
1989 //-----------------------------------------------------------------------
1990 /**
1991 * <p>Finds the index of the given value in the array.</p>
1992 *
1993 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
1994 *
1995 * @param array the array to search through for the object, may be <code>null</code>
1996 * @param valueToFind the value to find
1997 * @return the index of the value within the array,
1998 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
1999 * @since 2.1
2000 */
2001 public static int indexOf(char[] array, char valueToFind) {
2002 return indexOf(array, valueToFind, 0);
2003 }
2004
2005 /**
2006 * <p>Finds the index of the given value in the array starting at the given index.</p>
2007 *
2008 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2009 *
2010 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2011 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2012 *
2013 * @param array the array to search through for the object, may be <code>null</code>
2014 * @param valueToFind the value to find
2015 * @param startIndex the index to start searching at
2016 * @return the index of the value within the array,
2017 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2018 * @since 2.1
2019 */
2020 public static int indexOf(char[] array, char valueToFind, int startIndex) {
2021 if (array == null) {
2022 return INDEX_NOT_FOUND;
2023 }
2024 if (startIndex < 0) {
2025 startIndex = 0;
2026 }
2027 for (int i = startIndex; i < array.length; i++) {
2028 if (valueToFind == array[i]) {
2029 return i;
2030 }
2031 }
2032 return INDEX_NOT_FOUND;
2033 }
2034
2035 /**
2036 * <p>Finds the last index of the given value within the array.</p>
2037 *
2038 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2039 *
2040 * @param array the array to travers backwords looking for the object, may be <code>null</code>
2041 * @param valueToFind the object to find
2042 * @return the last index of the value within the array,
2043 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2044 * @since 2.1
2045 */
2046 public static int lastIndexOf(char[] array, char valueToFind) {
2047 return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2048 }
2049
2050 /**
2051 * <p>Finds the last index of the given value in the array starting at the given index.</p>
2052 *
2053 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2054 *
2055 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2056 * array length will search from the end of the array.</p>
2057 *
2058 * @param array the array to traverse for looking for the object, may be <code>null</code>
2059 * @param valueToFind the value to find
2060 * @param startIndex the start index to travers backwards from
2061 * @return the last index of the value within the array,
2062 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2063 * @since 2.1
2064 */
2065 public static int lastIndexOf(char[] array, char valueToFind, int startIndex) {
2066 if (array == null) {
2067 return INDEX_NOT_FOUND;
2068 }
2069 if (startIndex < 0) {
2070 return INDEX_NOT_FOUND;
2071 } else if (startIndex >= array.length) {
2072 startIndex = array.length - 1;
2073 }
2074 for (int i = startIndex; i >= 0; i--) {
2075 if (valueToFind == array[i]) {
2076 return i;
2077 }
2078 }
2079 return INDEX_NOT_FOUND;
2080 }
2081
2082 /**
2083 * <p>Checks if the value is in the given array.</p>
2084 *
2085 * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2086 *
2087 * @param array the array to search through
2088 * @param valueToFind the value to find
2089 * @return <code>true</code> if the array contains the object
2090 * @since 2.1
2091 */
2092 public static boolean contains(char[] array, char valueToFind) {
2093 return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2094 }
2095
2096 // byte IndexOf
2097 //-----------------------------------------------------------------------
2098 /**
2099 * <p>Finds the index of the given value in the array.</p>
2100 *
2101 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2102 *
2103 * @param array the array to search through for the object, may be <code>null</code>
2104 * @param valueToFind the value to find
2105 * @return the index of the value within the array,
2106 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2107 */
2108 public static int indexOf(byte[] array, byte valueToFind) {
2109 return indexOf(array, valueToFind, 0);
2110 }
2111
2112 /**
2113 * <p>Finds the index of the given value in the array starting at the given index.</p>
2114 *
2115 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2116 *
2117 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2118 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2119 *
2120 * @param array the array to search through for the object, may be <code>null</code>
2121 * @param valueToFind the value to find
2122 * @param startIndex the index to start searching at
2123 * @return the index of the value within the array,
2124 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2125 */
2126 public static int indexOf(byte[] array, byte valueToFind, int startIndex) {
2127 if (array == null) {
2128 return INDEX_NOT_FOUND;
2129 }
2130 if (startIndex < 0) {
2131 startIndex = 0;
2132 }
2133 for (int i = startIndex; i < array.length; i++) {
2134 if (valueToFind == array[i]) {
2135 return i;
2136 }
2137 }
2138 return INDEX_NOT_FOUND;
2139 }
2140
2141 /**
2142 * <p>Finds the last index of the given value within the array.</p>
2143 *
2144 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2145 *
2146 * @param array the array to travers backwords looking for the object, may be <code>null</code>
2147 * @param valueToFind the object to find
2148 * @return the last index of the value within the array,
2149 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2150 */
2151 public static int lastIndexOf(byte[] array, byte valueToFind) {
2152 return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2153 }
2154
2155 /**
2156 * <p>Finds the last index of the given value in the array starting at the given index.</p>
2157 *
2158 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2159 *
2160 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2161 * array length will search from the end of the array.</p>
2162 *
2163 * @param array the array to traverse for looking for the object, may be <code>null</code>
2164 * @param valueToFind the value to find
2165 * @param startIndex the start index to travers backwards from
2166 * @return the last index of the value within the array,
2167 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2168 */
2169 public static int lastIndexOf(byte[] array, byte valueToFind, int startIndex) {
2170 if (array == null) {
2171 return INDEX_NOT_FOUND;
2172 }
2173 if (startIndex < 0) {
2174 return INDEX_NOT_FOUND;
2175 } else if (startIndex >= array.length) {
2176 startIndex = array.length - 1;
2177 }
2178 for (int i = startIndex; i >= 0; i--) {
2179 if (valueToFind == array[i]) {
2180 return i;
2181 }
2182 }
2183 return INDEX_NOT_FOUND;
2184 }
2185
2186 /**
2187 * <p>Checks if the value is in the given array.</p>
2188 *
2189 * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2190 *
2191 * @param array the array to search through
2192 * @param valueToFind the value to find
2193 * @return <code>true</code> if the array contains the object
2194 */
2195 public static boolean contains(byte[] array, byte valueToFind) {
2196 return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2197 }
2198
2199 // double IndexOf
2200 //-----------------------------------------------------------------------
2201 /**
2202 * <p>Finds the index of the given value in the array.</p>
2203 *
2204 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2205 *
2206 * @param array the array to search through for the object, may be <code>null</code>
2207 * @param valueToFind the value to find
2208 * @return the index of the value within the array,
2209 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2210 */
2211 public static int indexOf(double[] array, double valueToFind) {
2212 return indexOf(array, valueToFind, 0);
2213 }
2214
2215 /**
2216 * <p>Finds the index of the given value within a given tolerance in the array.
2217 * This method will return the index of the first value which falls between the region
2218 * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
2219 *
2220 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2221 *
2222 * @param array the array to search through for the object, may be <code>null</code>
2223 * @param valueToFind the value to find
2224 * @param tolerance tolerance of the search
2225 * @return the index of the value within the array,
2226 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2227 */
2228 public static int indexOf(double[] array, double valueToFind, double tolerance) {
2229 return indexOf(array, valueToFind, 0, tolerance);
2230 }
2231
2232 /**
2233 * <p>Finds the index of the given value in the array starting at the given index.</p>
2234 *
2235 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2236 *
2237 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2238 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2239 *
2240 * @param array the array to search through for the object, may be <code>null</code>
2241 * @param valueToFind the value to find
2242 * @param startIndex the index to start searching at
2243 * @return the index of the value within the array,
2244 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2245 */
2246 public static int indexOf(double[] array, double valueToFind, int startIndex) {
2247 if (ArrayUtils.isEmpty(array)) {
2248 return INDEX_NOT_FOUND;
2249 }
2250 if (startIndex < 0) {
2251 startIndex = 0;
2252 }
2253 for (int i = startIndex; i < array.length; i++) {
2254 if (valueToFind == array[i]) {
2255 return i;
2256 }
2257 }
2258 return INDEX_NOT_FOUND;
2259 }
2260
2261 /**
2262 * <p>Finds the index of the given value in the array starting at the given index.
2263 * This method will return the index of the first value which falls between the region
2264 * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
2265 *
2266 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2267 *
2268 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2269 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2270 *
2271 * @param array the array to search through for the object, may be <code>null</code>
2272 * @param valueToFind the value to find
2273 * @param startIndex the index to start searching at
2274 * @param tolerance tolerance of the search
2275 * @return the index of the value within the array,
2276 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2277 */
2278 public static int indexOf(double[] array, double valueToFind, int startIndex, double tolerance) {
2279 if (ArrayUtils.isEmpty(array)) {
2280 return INDEX_NOT_FOUND;
2281 }
2282 if (startIndex < 0) {
2283 startIndex = 0;
2284 }
2285 double min = valueToFind - tolerance;
2286 double max = valueToFind + tolerance;
2287 for (int i = startIndex; i < array.length; i++) {
2288 if (array[i] >= min && array[i] <= max) {
2289 return i;
2290 }
2291 }
2292 return INDEX_NOT_FOUND;
2293 }
2294
2295 /**
2296 * <p>Finds the last index of the given value within the array.</p>
2297 *
2298 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2299 *
2300 * @param array the array to travers backwords looking for the object, may be <code>null</code>
2301 * @param valueToFind the object to find
2302 * @return the last index of the value within the array,
2303 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2304 */
2305 public static int lastIndexOf(double[] array, double valueToFind) {
2306 return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2307 }
2308
2309 /**
2310 * <p>Finds the last index of the given value within a given tolerance in the array.
2311 * This method will return the index of the last value which falls between the region
2312 * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
2313 *
2314 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2315 *
2316 * @param array the array to search through for the object, may be <code>null</code>
2317 * @param valueToFind the value to find
2318 * @param tolerance tolerance of the search
2319 * @return the index of the value within the array,
2320 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2321 */
2322 public static int lastIndexOf(double[] array, double valueToFind, double tolerance) {
2323 return lastIndexOf(array, valueToFind, Integer.MAX_VALUE, tolerance);
2324 }
2325
2326 /**
2327 * <p>Finds the last index of the given value in the array starting at the given index.</p>
2328 *
2329 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2330 *
2331 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2332 * array length will search from the end of the array.</p>
2333 *
2334 * @param array the array to traverse for looking for the object, may be <code>null</code>
2335 * @param valueToFind the value to find
2336 * @param startIndex the start index to travers backwards from
2337 * @return the last index of the value within the array,
2338 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2339 */
2340 public static int lastIndexOf(double[] array, double valueToFind, int startIndex) {
2341 if (ArrayUtils.isEmpty(array)) {
2342 return INDEX_NOT_FOUND;
2343 }
2344 if (startIndex < 0) {
2345 return INDEX_NOT_FOUND;
2346 } else if (startIndex >= array.length) {
2347 startIndex = array.length - 1;
2348 }
2349 for (int i = startIndex; i >= 0; i--) {
2350 if (valueToFind == array[i]) {
2351 return i;
2352 }
2353 }
2354 return INDEX_NOT_FOUND;
2355 }
2356
2357 /**
2358 * <p>Finds the last index of the given value in the array starting at the given index.
2359 * This method will return the index of the last value which falls between the region
2360 * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
2361 *
2362 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2363 *
2364 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2365 * array length will search from the end of the array.</p>
2366 *
2367 * @param array the array to traverse for looking for the object, may be <code>null</code>
2368 * @param valueToFind the value to find
2369 * @param startIndex the start index to travers backwards from
2370 * @param tolerance search for value within plus/minus this amount
2371 * @return the last index of the value within the array,
2372 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2373 */
2374 public static int lastIndexOf(double[] array, double valueToFind, int startIndex, double tolerance) {
2375 if (ArrayUtils.isEmpty(array)) {
2376 return INDEX_NOT_FOUND;
2377 }
2378 if (startIndex < 0) {
2379 return INDEX_NOT_FOUND;
2380 } else if (startIndex >= array.length) {
2381 startIndex = array.length - 1;
2382 }
2383 double min = valueToFind - tolerance;
2384 double max = valueToFind + tolerance;
2385 for (int i = startIndex; i >= 0; i--) {
2386 if (array[i] >= min && array[i] <= max) {
2387 return i;
2388 }
2389 }
2390 return INDEX_NOT_FOUND;
2391 }
2392
2393 /**
2394 * <p>Checks if the value is in the given array.</p>
2395 *
2396 * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2397 *
2398 * @param array the array to search through
2399 * @param valueToFind the value to find
2400 * @return <code>true</code> if the array contains the object
2401 */
2402 public static boolean contains(double[] array, double valueToFind) {
2403 return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2404 }
2405
2406 /**
2407 * <p>Checks if a value falling within the given tolerance is in the
2408 * given array. If the array contains a value within the inclusive range
2409 * defined by (value - tolerance) to (value + tolerance).</p>
2410 *
2411 * <p>The method returns <code>false</code> if a <code>null</code> array
2412 * is passed in.</p>
2413 *
2414 * @param array the array to search
2415 * @param valueToFind the value to find
2416 * @param tolerance the array contains the tolerance of the search
2417 * @return true if value falling within tolerance is in array
2418 */
2419 public static boolean contains(double[] array, double valueToFind, double tolerance) {
2420 return indexOf(array, valueToFind, 0, tolerance) != INDEX_NOT_FOUND;
2421 }
2422
2423 // float IndexOf
2424 //-----------------------------------------------------------------------
2425 /**
2426 * <p>Finds the index of the given value in the array.</p>
2427 *
2428 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2429 *
2430 * @param array the array to search through for the object, may be <code>null</code>
2431 * @param valueToFind the value to find
2432 * @return the index of the value within the array,
2433 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2434 */
2435 public static int indexOf(float[] array, float valueToFind) {
2436 return indexOf(array, valueToFind, 0);
2437 }
2438
2439 /**
2440 * <p>Finds the index of the given value in the array starting at the given index.</p>
2441 *
2442 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2443 *
2444 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2445 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2446 *
2447 * @param array the array to search through for the object, may be <code>null</code>
2448 * @param valueToFind the value to find
2449 * @param startIndex the index to start searching at
2450 * @return the index of the value within the array,
2451 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2452 */
2453 public static int indexOf(float[] array, float valueToFind, int startIndex) {
2454 if (ArrayUtils.isEmpty(array)) {
2455 return INDEX_NOT_FOUND;
2456 }
2457 if (startIndex < 0) {
2458 startIndex = 0;
2459 }
2460 for (int i = startIndex; i < array.length; i++) {
2461 if (valueToFind == array[i]) {
2462 return i;
2463 }
2464 }
2465 return INDEX_NOT_FOUND;
2466 }
2467
2468 /**
2469 * <p>Finds the last index of the given value within the array.</p>
2470 *
2471 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2472 *
2473 * @param array the array to travers backwords looking for the object, may be <code>null</code>
2474 * @param valueToFind the object to find
2475 * @return the last index of the value within the array,
2476 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2477 */
2478 public static int lastIndexOf(float[] array, float valueToFind) {
2479 return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2480 }
2481
2482 /**
2483 * <p>Finds the last index of the given value in the array starting at the given index.</p>
2484 *
2485 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2486 *
2487 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than the
2488 * array length will search from the end of the array.</p>
2489 *
2490 * @param array the array to traverse for looking for the object, may be <code>null</code>
2491 * @param valueToFind the value to find
2492 * @param startIndex the start index to travers backwards from
2493 * @return the last index of the value within the array,
2494 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2495 */
2496 public static int lastIndexOf(float[] array, float valueToFind, int startIndex) {
2497 if (ArrayUtils.isEmpty(array)) {
2498 return INDEX_NOT_FOUND;
2499 }
2500 if (startIndex < 0) {
2501 return INDEX_NOT_FOUND;
2502 } else if (startIndex >= array.length) {
2503 startIndex = array.length - 1;
2504 }
2505 for (int i = startIndex; i >= 0; i--) {
2506 if (valueToFind == array[i]) {
2507 return i;
2508 }
2509 }
2510 return INDEX_NOT_FOUND;
2511 }
2512
2513 /**
2514 * <p>Checks if the value is in the given array.</p>
2515 *
2516 * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2517 *
2518 * @param array the array to search through
2519 * @param valueToFind the value to find
2520 * @return <code>true</code> if the array contains the object
2521 */
2522 public static boolean contains(float[] array, float valueToFind) {
2523 return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2524 }
2525
2526 // boolean IndexOf
2527 //-----------------------------------------------------------------------
2528 /**
2529 * <p>Finds the index of the given value in the array.</p>
2530 *
2531 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2532 *
2533 * @param array the array to search through for the object, may be <code>null</code>
2534 * @param valueToFind the value to find
2535 * @return the index of the value within the array,
2536 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2537 */
2538 public static int indexOf(boolean[] array, boolean valueToFind) {
2539 return indexOf(array, valueToFind, 0);
2540 }
2541
2542 /**
2543 * <p>Finds the index of the given value in the array starting at the given index.</p>
2544 *
2545 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2546 *
2547 * <p>A negative startIndex is treated as zero. A startIndex larger than the array
2548 * length will return {@link #INDEX_NOT_FOUND} (<code>-1</code>).</p>
2549 *
2550 * @param array the array to search through for the object, may be <code>null</code>
2551 * @param valueToFind the value to find
2552 * @param startIndex the index to start searching at
2553 * @return the index of the value within the array,
2554 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code>
2555 * array input
2556 */
2557 public static int indexOf(boolean[] array, boolean valueToFind, int startIndex) {
2558 if (ArrayUtils.isEmpty(array)) {
2559 return INDEX_NOT_FOUND;
2560 }
2561 if (startIndex < 0) {
2562 startIndex = 0;
2563 }
2564 for (int i = startIndex; i < array.length; i++) {
2565 if (valueToFind == array[i]) {
2566 return i;
2567 }
2568 }
2569 return INDEX_NOT_FOUND;
2570 }
2571
2572 /**
2573 * <p>Finds the last index of the given value within the array.</p>
2574 *
2575 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) if
2576 * <code>null</code> array input.</p>
2577 *
2578 * @param array the array to travers backwords looking for the object, may be <code>null</code>
2579 * @param valueToFind the object to find
2580 * @return the last index of the value within the array,
2581 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2582 */
2583 public static int lastIndexOf(boolean[] array, boolean valueToFind) {
2584 return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
2585 }
2586
2587 /**
2588 * <p>Finds the last index of the given value in the array starting at the given index.</p>
2589 *
2590 * <p>This method returns {@link #INDEX_NOT_FOUND} (<code>-1</code>) for a <code>null</code> input array.</p>
2591 *
2592 * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} (<code>-1</code>). A startIndex larger than
2593 * the array length will search from the end of the array.</p>
2594 *
2595 * @param array the array to traverse for looking for the object, may be <code>null</code>
2596 * @param valueToFind the value to find
2597 * @param startIndex the start index to travers backwards from
2598 * @return the last index of the value within the array,
2599 * {@link #INDEX_NOT_FOUND} (<code>-1</code>) if not found or <code>null</code> array input
2600 */
2601 public static int lastIndexOf(boolean[] array, boolean valueToFind, int startIndex) {
2602 if (ArrayUtils.isEmpty(array)) {
2603 return INDEX_NOT_FOUND;
2604 }
2605 if (startIndex < 0) {
2606 return INDEX_NOT_FOUND;
2607 } else if (startIndex >= array.length) {
2608 startIndex = array.length - 1;
2609 }
2610 for (int i = startIndex; i >= 0; i--) {
2611 if (valueToFind == array[i]) {
2612 return i;
2613 }
2614 }
2615 return INDEX_NOT_FOUND;
2616 }
2617
2618 /**
2619 * <p>Checks if the value is in the given array.</p>
2620 *
2621 * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
2622 *
2623 * @param array the array to search through
2624 * @param valueToFind the value to find
2625 * @return <code>true</code> if the array contains the object
2626 */
2627 public static boolean contains(boolean[] array, boolean valueToFind) {
2628 return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
2629 }
2630
2631 // Primitive/Object array converters
2632 // ----------------------------------------------------------------------
2633
2634 // Character array converters
2635 // ----------------------------------------------------------------------
2636 /**
2637 * <p>Converts an array of object Characters to primitives.</p>
2638 *
2639 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2640 *
2641 * @param array a <code>Character</code> array, may be <code>null</code>
2642 * @return a <code>char</code> array, <code>null</code> if null array input
2643 * @throws NullPointerException if array content is <code>null</code>
2644 */
2645 public static char[] toPrimitive(Character[] array) {
2646 if (array == null) {
2647 return null;
2648 } else if (array.length == 0) {
2649 return EMPTY_CHAR_ARRAY;
2650 }
2651 final char[] result = new char[array.length];
2652 for (int i = 0; i < array.length; i++) {
2653 result[i] = array[i].charValue();
2654 }
2655 return result;
2656 }
2657
2658 /**
2659 * <p>Converts an array of object Character to primitives handling <code>null</code>.</p>
2660 *
2661 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2662 *
2663 * @param array a <code>Character</code> array, may be <code>null</code>
2664 * @param valueForNull the value to insert if <code>null</code> found
2665 * @return a <code>char</code> array, <code>null</code> if null array input
2666 */
2667 public static char[] toPrimitive(Character[] array, char valueForNull) {
2668 if (array == null) {
2669 return null;
2670 } else if (array.length == 0) {
2671 return EMPTY_CHAR_ARRAY;
2672 }
2673 final char[] result = new char[array.length];
2674 for (int i = 0; i < array.length; i++) {
2675 Character b = array[i];
2676 result[i] = (b == null ? valueForNull : b.charValue());
2677 }
2678 return result;
2679 }
2680
2681 /**
2682 * <p>Converts an array of primitive chars to objects.</p>
2683 *
2684 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2685 *
2686 * @param array a <code>char</code> array
2687 * @return a <code>Character</code> array, <code>null</code> if null array input
2688 */
2689 public static Character[] toObject(char[] array) {
2690 if (array == null) {
2691 return null;
2692 } else if (array.length == 0) {
2693 return EMPTY_CHARACTER_OBJECT_ARRAY;
2694 }
2695 final Character[] result = new Character[array.length];
2696 for (int i = 0; i < array.length; i++) {
2697 result[i] = new Character(array[i]);
2698 }
2699 return result;
2700 }
2701
2702 // Long array converters
2703 // ----------------------------------------------------------------------
2704 /**
2705 * <p>Converts an array of object Longs to primitives.</p>
2706 *
2707 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2708 *
2709 * @param array a <code>Long</code> array, may be <code>null</code>
2710 * @return a <code>long</code> array, <code>null</code> if null array input
2711 * @throws NullPointerException if array content is <code>null</code>
2712 */
2713 public static long[] toPrimitive(Long[] array) {
2714 if (array == null) {
2715 return null;
2716 } else if (array.length == 0) {
2717 return EMPTY_LONG_ARRAY;
2718 }
2719 final long[] result = new long[array.length];
2720 for (int i = 0; i < array.length; i++) {
2721 result[i] = array[i].longValue();
2722 }
2723 return result;
2724 }
2725
2726 /**
2727 * <p>Converts an array of object Long to primitives handling <code>null</code>.</p>
2728 *
2729 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2730 *
2731 * @param array a <code>Long</code> array, may be <code>null</code>
2732 * @param valueForNull the value to insert if <code>null</code> found
2733 * @return a <code>long</code> array, <code>null</code> if null array input
2734 */
2735 public static long[] toPrimitive(Long[] array, long valueForNull) {
2736 if (array == null) {
2737 return null;
2738 } else if (array.length == 0) {
2739 return EMPTY_LONG_ARRAY;
2740 }
2741 final long[] result = new long[array.length];
2742 for (int i = 0; i < array.length; i++) {
2743 Long b = array[i];
2744 result[i] = (b == null ? valueForNull : b.longValue());
2745 }
2746 return result;
2747 }
2748
2749 /**
2750 * <p>Converts an array of primitive longs to objects.</p>
2751 *
2752 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2753 *
2754 * @param array a <code>long</code> array
2755 * @return a <code>Long</code> array, <code>null</code> if null array input
2756 */
2757 public static Long[] toObject(long[] array) {
2758 if (array == null) {
2759 return null;
2760 } else if (array.length == 0) {
2761 return EMPTY_LONG_OBJECT_ARRAY;
2762 }
2763 final Long[] result = new Long[array.length];
2764 for (int i = 0; i < array.length; i++) {
2765 result[i] = new Long(array[i]);
2766 }
2767 return result;
2768 }
2769
2770 // Int array converters
2771 // ----------------------------------------------------------------------
2772 /**
2773 * <p>Converts an array of object Integers to primitives.</p>
2774 *
2775 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2776 *
2777 * @param array a <code>Integer</code> array, may be <code>null</code>
2778 * @return an <code>int</code> array, <code>null</code> if null array input
2779 * @throws NullPointerException if array content is <code>null</code>
2780 */
2781 public static int[] toPrimitive(Integer[] array) {
2782 if (array == null) {
2783 return null;
2784 } else if (array.length == 0) {
2785 return EMPTY_INT_ARRAY;
2786 }
2787 final int[] result = new int[array.length];
2788 for (int i = 0; i < array.length; i++) {
2789 result[i] = array[i].intValue();
2790 }
2791 return result;
2792 }
2793
2794 /**
2795 * <p>Converts an array of object Integer to primitives handling <code>null</code>.</p>
2796 *
2797 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2798 *
2799 * @param array a <code>Integer</code> array, may be <code>null</code>
2800 * @param valueForNull the value to insert if <code>null</code> found
2801 * @return an <code>int</code> array, <code>null</code> if null array input
2802 */
2803 public static int[] toPrimitive(Integer[] array, int valueForNull) {
2804 if (array == null) {
2805 return null;
2806 } else if (array.length == 0) {
2807 return EMPTY_INT_ARRAY;
2808 }
2809 final int[] result = new int[array.length];
2810 for (int i = 0; i < array.length; i++) {
2811 Integer b = array[i];
2812 result[i] = (b == null ? valueForNull : b.intValue());
2813 }
2814 return result;
2815 }
2816
2817 /**
2818 * <p>Converts an array of primitive ints to objects.</p>
2819 *
2820 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2821 *
2822 * @param array an <code>int</code> array
2823 * @return an <code>Integer</code> array, <code>null</code> if null array input
2824 */
2825 public static Integer[] toObject(int[] array) {
2826 if (array == null) {
2827 return null;
2828 } else if (array.length == 0) {
2829 return EMPTY_INTEGER_OBJECT_ARRAY;
2830 }
2831 final Integer[] result = new Integer[array.length];
2832 for (int i = 0; i < array.length; i++) {
2833 result[i] = new Integer(array[i]);
2834 }
2835 return result;
2836 }
2837
2838 // Short array converters
2839 // ----------------------------------------------------------------------
2840 /**
2841 * <p>Converts an array of object Shorts to primitives.</p>
2842 *
2843 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2844 *
2845 * @param array a <code>Short</code> array, may be <code>null</code>
2846 * @return a <code>byte</code> array, <code>null</code> if null array input
2847 * @throws NullPointerException if array content is <code>null</code>
2848 */
2849 public static short[] toPrimitive(Short[] array) {
2850 if (array == null) {
2851 return null;
2852 } else if (array.length == 0) {
2853 return EMPTY_SHORT_ARRAY;
2854 }
2855 final short[] result = new short[array.length];
2856 for (int i = 0; i < array.length; i++) {
2857 result[i] = array[i].shortValue();
2858 }
2859 return result;
2860 }
2861
2862 /**
2863 * <p>Converts an array of object Short to primitives handling <code>null</code>.</p>
2864 *
2865 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2866 *
2867 * @param array a <code>Short</code> array, may be <code>null</code>
2868 * @param valueForNull the value to insert if <code>null</code> found
2869 * @return a <code>byte</code> array, <code>null</code> if null array input
2870 */
2871 public static short[] toPrimitive(Short[] array, short valueForNull) {
2872 if (array == null) {
2873 return null;
2874 } else if (array.length == 0) {
2875 return EMPTY_SHORT_ARRAY;
2876 }
2877 final short[] result = new short[array.length];
2878 for (int i = 0; i < array.length; i++) {
2879 Short b = array[i];
2880 result[i] = (b == null ? valueForNull : b.shortValue());
2881 }
2882 return result;
2883 }
2884
2885 /**
2886 * <p>Converts an array of primitive shorts to objects.</p>
2887 *
2888 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2889 *
2890 * @param array a <code>short</code> array
2891 * @return a <code>Short</code> array, <code>null</code> if null array input
2892 */
2893 public static Short[] toObject(short[] array) {
2894 if (array == null) {
2895 return null;
2896 } else if (array.length == 0) {
2897 return EMPTY_SHORT_OBJECT_ARRAY;
2898 }
2899 final Short[] result = new Short[array.length];
2900 for (int i = 0; i < array.length; i++) {
2901 result[i] = new Short(array[i]);
2902 }
2903 return result;
2904 }
2905
2906 // Byte array converters
2907 // ----------------------------------------------------------------------
2908 /**
2909 * <p>Converts an array of object Bytes to primitives.</p>
2910 *
2911 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2912 *
2913 * @param array a <code>Byte</code> array, may be <code>null</code>
2914 * @return a <code>byte</code> array, <code>null</code> if null array input
2915 * @throws NullPointerException if array content is <code>null</code>
2916 */
2917 public static byte[] toPrimitive(Byte[] array) {
2918 if (array == null) {
2919 return null;
2920 } else if (array.length == 0) {
2921 return EMPTY_BYTE_ARRAY;
2922 }
2923 final byte[] result = new byte[array.length];
2924 for (int i = 0; i < array.length; i++) {
2925 result[i] = array[i].byteValue();
2926 }
2927 return result;
2928 }
2929
2930 /**
2931 * <p>Converts an array of object Bytes to primitives handling <code>null</code>.</p>
2932 *
2933 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2934 *
2935 * @param array a <code>Byte</code> array, may be <code>null</code>
2936 * @param valueForNull the value to insert if <code>null</code> found
2937 * @return a <code>byte</code> array, <code>null</code> if null array input
2938 */
2939 public static byte[] toPrimitive(Byte[] array, byte valueForNull) {
2940 if (array == null) {
2941 return null;
2942 } else if (array.length == 0) {
2943 return EMPTY_BYTE_ARRAY;
2944 }
2945 final byte[] result = new byte[array.length];
2946 for (int i = 0; i < array.length; i++) {
2947 Byte b = array[i];
2948 result[i] = (b == null ? valueForNull : b.byteValue());
2949 }
2950 return result;
2951 }
2952
2953 /**
2954 * <p>Converts an array of primitive bytes to objects.</p>
2955 *
2956 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2957 *
2958 * @param array a <code>byte</code> array
2959 * @return a <code>Byte</code> array, <code>null</code> if null array input
2960 */
2961 public static Byte[] toObject(byte[] array) {
2962 if (array == null) {
2963 return null;
2964 } else if (array.length == 0) {
2965 return EMPTY_BYTE_OBJECT_ARRAY;
2966 }
2967 final Byte[] result = new Byte[array.length];
2968 for (int i = 0; i < array.length; i++) {
2969 result[i] = new Byte(array[i]);
2970 }
2971 return result;
2972 }
2973
2974 // Double array converters
2975 // ----------------------------------------------------------------------
2976 /**
2977 * <p>Converts an array of object Doubles to primitives.</p>
2978 *
2979 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
2980 *
2981 * @param array a <code>Double</code> array, may be <code>null</code>
2982 * @return a <code>double</code> array, <code>null</code> if null array input
2983 * @throws NullPointerException if array content is <code>null</code>
2984 */
2985 public static double[] toPrimitive(Double[] array) {
2986 if (array == null) {
2987 return null;
2988 } else if (array.length == 0) {
2989 return EMPTY_DOUBLE_ARRAY;
2990 }
2991 final double[] result = new double[array.length];
2992 for (int i = 0; i < array.length; i++) {
2993 result[i] = array[i].doubleValue();
2994 }
2995 return result;
2996 }
2997
2998 /**
2999 * <p>Converts an array of object Doubles to primitives handling <code>null</code>.</p>
3000 *
3001 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3002 *
3003 * @param array a <code>Double</code> array, may be <code>null</code>
3004 * @param valueForNull the value to insert if <code>null</code> found
3005 * @return a <code>double</code> array, <code>null</code> if null array input
3006 */
3007 public static double[] toPrimitive(Double[] array, double valueForNull) {
3008 if (array == null) {
3009 return null;
3010 } else if (array.length == 0) {
3011 return EMPTY_DOUBLE_ARRAY;
3012 }
3013 final double[] result = new double[array.length];
3014 for (int i = 0; i < array.length; i++) {
3015 Double b = array[i];
3016 result[i] = (b == null ? valueForNull : b.doubleValue());
3017 }
3018 return result;
3019 }
3020
3021 /**
3022 * <p>Converts an array of primitive doubles to objects.</p>
3023 *
3024 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3025 *
3026 * @param array a <code>double</code> array
3027 * @return a <code>Double</code> array, <code>null</code> if null array input
3028 */
3029 public static Double[] toObject(double[] array) {
3030 if (array == null) {
3031 return null;
3032 } else if (array.length == 0) {
3033 return EMPTY_DOUBLE_OBJECT_ARRAY;
3034 }
3035 final Double[] result = new Double[array.length];
3036 for (int i = 0; i < array.length; i++) {
3037 result[i] = new Double(array[i]);
3038 }
3039 return result;
3040 }
3041
3042 // Float array converters
3043 // ----------------------------------------------------------------------
3044 /**
3045 * <p>Converts an array of object Floats to primitives.</p>
3046 *
3047 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3048 *
3049 * @param array a <code>Float</code> array, may be <code>null</code>
3050 * @return a <code>float</code> array, <code>null</code> if null array input
3051 * @throws NullPointerException if array content is <code>null</code>
3052 */
3053 public static float[] toPrimitive(Float[] array) {
3054 if (array == null) {
3055 return null;
3056 } else if (array.length == 0) {
3057 return EMPTY_FLOAT_ARRAY;
3058 }
3059 final float[] result = new float[array.length];
3060 for (int i = 0; i < array.length; i++) {
3061 result[i] = array[i].floatValue();
3062 }
3063 return result;
3064 }
3065
3066 /**
3067 * <p>Converts an array of object Floats to primitives handling <code>null</code>.</p>
3068 *
3069 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3070 *
3071 * @param array a <code>Float</code> array, may be <code>null</code>
3072 * @param valueForNull the value to insert if <code>null</code> found
3073 * @return a <code>float</code> array, <code>null</code> if null array input
3074 */
3075 public static float[] toPrimitive(Float[] array, float valueForNull) {
3076 if (array == null) {
3077 return null;
3078 } else if (array.length == 0) {
3079 return EMPTY_FLOAT_ARRAY;
3080 }
3081 final float[] result = new float[array.length];
3082 for (int i = 0; i < array.length; i++) {
3083 Float b = array[i];
3084 result[i] = (b == null ? valueForNull : b.floatValue());
3085 }
3086 return result;
3087 }
3088
3089 /**
3090 * <p>Converts an array of primitive floats to objects.</p>
3091 *
3092 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3093 *
3094 * @param array a <code>float</code> array
3095 * @return a <code>Float</code> array, <code>null</code> if null array input
3096 */
3097 public static Float[] toObject(float[] array) {
3098 if (array == null) {
3099 return null;
3100 } else if (array.length == 0) {
3101 return EMPTY_FLOAT_OBJECT_ARRAY;
3102 }
3103 final Float[] result = new Float[array.length];
3104 for (int i = 0; i < array.length; i++) {
3105 result[i] = new Float(array[i]);
3106 }
3107 return result;
3108 }
3109
3110 // Boolean array converters
3111 // ----------------------------------------------------------------------
3112 /**
3113 * <p>Converts an array of object Booleans to primitives.</p>
3114 *
3115 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3116 *
3117 * @param array a <code>Boolean</code> array, may be <code>null</code>
3118 * @return a <code>boolean</code> array, <code>null</code> if null array input
3119 * @throws NullPointerException if array content is <code>null</code>
3120 */
3121 public static boolean[] toPrimitive(Boolean[] array) {
3122 if (array == null) {
3123 return null;
3124 } else if (array.length == 0) {
3125 return EMPTY_BOOLEAN_ARRAY;
3126 }
3127 final boolean[] result = new boolean[array.length];
3128 for (int i = 0; i < array.length; i++) {
3129 result[i] = array[i].booleanValue();
3130 }
3131 return result;
3132 }
3133
3134 /**
3135 * <p>Converts an array of object Booleans to primitives handling <code>null</code>.</p>
3136 *
3137 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3138 *
3139 * @param array a <code>Boolean</code> array, may be <code>null</code>
3140 * @param valueForNull the value to insert if <code>null</code> found
3141 * @return a <code>boolean</code> array, <code>null</code> if null array input
3142 */
3143 public static boolean[] toPrimitive(Boolean[] array, boolean valueForNull) {
3144 if (array == null) {
3145 return null;
3146 } else if (array.length == 0) {
3147 return EMPTY_BOOLEAN_ARRAY;
3148 }
3149 final boolean[] result = new boolean[array.length];
3150 for (int i = 0; i < array.length; i++) {
3151 Boolean b = array[i];
3152 result[i] = (b == null ? valueForNull : b.booleanValue());
3153 }
3154 return result;
3155 }
3156
3157 /**
3158 * <p>Converts an array of primitive booleans to objects.</p>
3159 *
3160 * <p>This method returns <code>null</code> for a <code>null</code> input array.</p>
3161 *
3162 * @param array a <code>boolean</code> array
3163 * @return a <code>Boolean</code> array, <code>null</code> if null array input
3164 */
3165 public static Boolean[] toObject(boolean[] array) {
3166 if (array == null) {
3167 return null;
3168 } else if (array.length == 0) {
3169 return EMPTY_BOOLEAN_OBJECT_ARRAY;
3170 }
3171 final Boolean[] result = new Boolean[array.length];
3172 for (int i = 0; i < array.length; i++) {
3173 result[i] = (array[i] ? Boolean.TRUE : Boolean.FALSE);
3174 }
3175 return result;
3176 }
3177
3178 // ----------------------------------------------------------------------
3179 /**
3180 * <p>Checks if an array of Objects is empty or <code>null</code>.</p>
3181 *
3182 * @param array the array to test
3183 * @return <code>true</code> if the array is empty or <code>null</code>
3184 * @since 2.1
3185 */
3186 public static boolean isEmpty(Object[] array) {
3187 return array == null || array.length == 0;
3188 }
3189
3190 /**
3191 * <p>Checks if an array of primitive longs is empty or <code>null</code>.</p>
3192 *
3193 * @param array the array to test
3194 * @return <code>true</code> if the array is empty or <code>null</code>
3195 * @since 2.1
3196 */
3197 public static boolean isEmpty(long[] array) {
3198 return array == null || array.length == 0;
3199 }
3200
3201 /**
3202 * <p>Checks if an array of primitive ints is empty or <code>null</code>.</p>
3203 *
3204 * @param array the array to test
3205 * @return <code>true</code> if the array is empty or <code>null</code>
3206 * @since 2.1
3207 */
3208 public static boolean isEmpty(int[] array) {
3209 return array == null || array.length == 0;
3210 }
3211
3212 /**
3213 * <p>Checks if an array of primitive shorts is empty or <code>null</code>.</p>
3214 *
3215 * @param array the array to test
3216 * @return <code>true</code> if the array is empty or <code>null</code>
3217 * @since 2.1
3218 */
3219 public static boolean isEmpty(short[] array) {
3220 return array == null || array.length == 0;
3221 }
3222
3223 /**
3224 * <p>Checks if an array of primitive chars is empty or <code>null</code>.</p>
3225 *
3226 * @param array the array to test
3227 * @return <code>true</code> if the array is empty or <code>null</code>
3228 * @since 2.1
3229 */
3230 public static boolean isEmpty(char[] array) {
3231 return array == null || array.length == 0;
3232 }
3233
3234 /**
3235 * <p>Checks if an array of primitive bytes is empty or <code>null</code>.</p>
3236 *
3237 * @param array the array to test
3238 * @return <code>true</code> if the array is empty or <code>null</code>
3239 * @since 2.1
3240 */
3241 public static boolean isEmpty(byte[] array) {
3242 return array == null || array.length == 0;
3243 }
3244
3245 /**
3246 * <p>Checks if an array of primitive doubles is empty or <code>null</code>.</p>
3247 *
3248 * @param array the array to test
3249 * @return <code>true</code> if the array is empty or <code>null</code>
3250 * @since 2.1
3251 */
3252 public static boolean isEmpty(double[] array) {
3253 return array == null || array.length == 0;
3254 }
3255
3256 /**
3257 * <p>Checks if an array of primitive floats is empty or <code>null</code>.</p>
3258 *
3259 * @param array the array to test
3260 * @return <code>true</code> if the array is empty or <code>null</code>
3261 * @since 2.1
3262 */
3263 public static boolean isEmpty(float[] array) {
3264 return array == null || array.length == 0;
3265 }
3266
3267 /**
3268 * <p>Checks if an array of primitive booleans is empty or <code>null</code>.</p>
3269 *
3270 * @param array the array to test
3271 * @return <code>true</code> if the array is empty or <code>null</code>
3272 * @since 2.1
3273 */
3274 public static boolean isEmpty(boolean[] array) {
3275 return array == null || array.length == 0;
3276 }
3277
3278 // ----------------------------------------------------------------------
3279 /**
3280 * <p>Checks if an array of Objects is not empty or not <code>null</code>.</p>
3281 *
3282 * @param array the array to test
3283 * @return <code>true</code> if the array is not empty or not <code>null</code>
3284 * @since 2.5
3285 */
3286 public static boolean isNotEmpty(Object[] array) {
3287 return (array != null && array.length != 0);
3288 }
3289
3290 /**
3291 * <p>Checks if an array of primitive longs is not empty or not <code>null</code>.</p>
3292 *
3293 * @param array the array to test
3294 * @return <code>true</code> if the array is not empty or not <code>null</code>
3295 * @since 2.5
3296 */
3297 public static boolean isNotEmpty(long[] array) {
3298 return (array != null && array.length != 0);
3299 }
3300
3301 /**
3302 * <p>Checks if an array of primitive ints is not empty or not <code>null</code>.</p>
3303 *
3304 * @param array the array to test
3305 * @return <code>true</code> if the array is not empty or not <code>null</code>
3306 * @since 2.5
3307 */
3308 public static boolean isNotEmpty(int[] array) {
3309 return (array != null && array.length != 0);
3310 }
3311
3312 /**
3313 * <p>Checks if an array of primitive shorts is not empty or not <code>null</code>.</p>
3314 *
3315 * @param array the array to test
3316 * @return <code>true</code> if the array is not empty or not <code>null</code>
3317 * @since 2.5
3318 */
3319 public static boolean isNotEmpty(short[] array) {
3320 return (array != null && array.length != 0);
3321 }
3322
3323 /**
3324 * <p>Checks if an array of primitive chars is not empty or not <code>null</code>.</p>
3325 *
3326 * @param array the array to test
3327 * @return <code>true</code> if the array is not empty or not <code>null</code>
3328 * @since 2.5
3329 */
3330 public static boolean isNotEmpty(char[] array) {
3331 return (array != null && array.length != 0);
3332 }
3333
3334 /**
3335 * <p>Checks if an array of primitive bytes is not empty or not <code>null</code>.</p>
3336 *
3337 * @param array the array to test
3338 * @return <code>true</code> if the array is not empty or not <code>null</code>
3339 * @since 2.5
3340 */
3341 public static boolean isNotEmpty(byte[] array) {
3342 return (array != null && array.length != 0);
3343 }
3344
3345 /**
3346 * <p>Checks if an array of primitive doubles is not empty or not <code>null</code>.</p>
3347 *
3348 * @param array the array to test
3349 * @return <code>true</code> if the array is not empty or not <code>null</code>
3350 * @since 2.5
3351 */
3352 public static boolean isNotEmpty(double[] array) {
3353 return (array != null && array.length != 0);
3354 }
3355
3356 /**
3357 * <p>Checks if an array of primitive floats is not empty or not <code>null</code>.</p>
3358 *
3359 * @param array the array to test
3360 * @return <code>true</code> if the array is not empty or not <code>null</code>
3361 * @since 2.5
3362 */
3363 public static boolean isNotEmpty(float[] array) {
3364 return (array != null && array.length != 0);
3365 }
3366
3367 /**
3368 * <p>Checks if an array of primitive booleans is not empty or not <code>null</code>.</p>
3369 *
3370 * @param array the array to test
3371 * @return <code>true</code> if the array is not empty or not <code>null</code>
3372 * @since 2.5
3373 */
3374 public static boolean isNotEmpty(boolean[] array) {
3375 return (array != null && array.length != 0);
3376 }
3377
3378 /**
3379 * <p>Adds all the elements of the given arrays into a new array.</p>
3380 * <p>The new array contains all of the element of <code>array1</code> followed
3381 * by all of the elements <code>array2</code>. When an array is returned, it is always
3382 * a new array.</p>
3383 *
3384 * <pre>
3385 * ArrayUtils.addAll(null, null) = null
3386 * ArrayUtils.addAll(array1, null) = cloned copy of array1
3387 * ArrayUtils.addAll(null, array2) = cloned copy of array2
3388 * ArrayUtils.addAll([], []) = []
3389 * ArrayUtils.addAll([null], [null]) = [null, null]
3390 * ArrayUtils.addAll(["a", "b", "c"], ["1", "2", "3"]) = ["a", "b", "c", "1", "2", "3"]
3391 * </pre>
3392 *
3393 * @param array1 the first array whose elements are added to the new array, may be <code>null</code>
3394 * @param array2 the second array whose elements are added to the new array, may be <code>null</code>
3395 * @return The new array, <code>null</code> if both arrays are <code>null</code>.
3396 * The type of the new array is the type of the first array,
3397 * unless the first array is null, in which case the type is the same as the second array.
3398 * @since 2.1
3399 * @throws IllegalArgumentException if the array types are incompatible
3400 */
3401 public static Object[] addAll(Object[] array1, Object[] array2) {
3402 if (array1 == null) {
3403 return clone(array2);
3404 } else if (array2 == null) {
3405 return clone(array1);
3406 }
3407 Object[] joinedArray = (Object[]) Array.newInstance(array1.getClass().getComponentType(),
3408 array1.length + array2.length);
3409 System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3410 try {
3411 System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3412 } catch (ArrayStoreException ase) {
3413 // Check if problem was due to incompatible types
3414 /*
3415 * We do this here, rather than before the copy because:
3416 * - it would be a wasted check most of the time
3417 * - safer, in case check turns out to be too strict
3418 */
3419 final Class type1 = array1.getClass().getComponentType();
3420 final Class type2 = array2.getClass().getComponentType();
3421 if (!type1.isAssignableFrom(type2)){
3422 throw new IllegalArgumentException("Cannot store "+type2.getName()+" in an array of "+type1.getName());
3423 }
3424 throw ase; // No, so rethrow original
3425 }
3426 return joinedArray;
3427 }
3428
3429 /**
3430 * <p>Adds all the elements of the given arrays into a new array.</p>
3431 * <p>The new array contains all of the element of <code>array1</code> followed
3432 * by all of the elements <code>array2</code>. When an array is returned, it is always
3433 * a new array.</p>
3434 *
3435 * <pre>
3436 * ArrayUtils.addAll(array1, null) = cloned copy of array1
3437 * ArrayUtils.addAll(null, array2) = cloned copy of array2
3438 * ArrayUtils.addAll([], []) = []
3439 * </pre>
3440 *
3441 * @param array1 the first array whose elements are added to the new array.
3442 * @param array2 the second array whose elements are added to the new array.
3443 * @return The new boolean[] array.
3444 * @since 2.1
3445 */
3446 public static boolean[] addAll(boolean[] array1, boolean[] array2) {
3447 if (array1 == null) {
3448 return clone(array2);
3449 } else if (array2 == null) {
3450 return clone(array1);
3451 }
3452 boolean[] joinedArray = new boolean[array1.length + array2.length];
3453 System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3454 System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3455 return joinedArray;
3456 }
3457
3458 /**
3459 * <p>Adds all the elements of the given arrays into a new array.</p>
3460 * <p>The new array contains all of the element of <code>array1</code> followed
3461 * by all of the elements <code>array2</code>. When an array is returned, it is always
3462 * a new array.</p>
3463 *
3464 * <pre>
3465 * ArrayUtils.addAll(array1, null) = cloned copy of array1
3466 * ArrayUtils.addAll(null, array2) = cloned copy of array2
3467 * ArrayUtils.addAll([], []) = []
3468 * </pre>
3469 *
3470 * @param array1 the first array whose elements are added to the new array.
3471 * @param array2 the second array whose elements are added to the new array.
3472 * @return The new char[] array.
3473 * @since 2.1
3474 */
3475 public static char[] addAll(char[] array1, char[] array2) {
3476 if (array1 == null) {
3477 return clone(array2);
3478 } else if (array2 == null) {
3479 return clone(array1);
3480 }
3481 char[] joinedArray = new char[array1.length + array2.length];
3482 System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3483 System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3484 return joinedArray;
3485 }
3486
3487 /**
3488 * <p>Adds all the elements of the given arrays into a new array.</p>
3489 * <p>The new array contains all of the element of <code>array1</code> followed
3490 * by all of the elements <code>array2</code>. When an array is returned, it is always
3491 * a new array.</p>
3492 *
3493 * <pre>
3494 * ArrayUtils.addAll(array1, null) = cloned copy of array1
3495 * ArrayUtils.addAll(null, array2) = cloned copy of array2
3496 * ArrayUtils.addAll([], []) = []
3497 * </pre>
3498 *
3499 * @param array1 the first array whose elements are added to the new array.
3500 * @param array2 the second array whose elements are added to the new array.
3501 * @return The new byte[] array.
3502 * @since 2.1
3503 */
3504 public static byte[] addAll(byte[] array1, byte[] array2) {
3505 if (array1 == null) {
3506 return clone(array2);
3507 } else if (array2 == null) {
3508 return clone(array1);
3509 }
3510 byte[] joinedArray = new byte[array1.length + array2.length];
3511 System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3512 System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3513 return joinedArray;
3514 }
3515
3516 /**
3517 * <p>Adds all the elements of the given arrays into a new array.</p>
3518 * <p>The new array contains all of the element of <code>array1</code> followed
3519 * by all of the elements <code>array2</code>. When an array is returned, it is always
3520 * a new array.</p>
3521 *
3522 * <pre>
3523 * ArrayUtils.addAll(array1, null) = cloned copy of array1
3524 * ArrayUtils.addAll(null, array2) = cloned copy of array2
3525 * ArrayUtils.addAll([], []) = []
3526 * </pre>
3527 *
3528 * @param array1 the first array whose elements are added to the new array.
3529 * @param array2 the second array whose elements are added to the new array.
3530 * @return The new short[] array.
3531 * @since 2.1
3532 */
3533 public static short[] addAll(short[] array1, short[] array2) {
3534 if (array1 == null) {
3535 return clone(array2);
3536 } else if (array2 == null) {
3537 return clone(array1);
3538 }
3539 short[] joinedArray = new short[array1.length + array2.length];
3540 System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3541 System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3542 return joinedArray;
3543 }
3544
3545 /**
3546 * <p>Adds all the elements of the given arrays into a new array.</p>
3547 * <p>The new array contains all of the element of <code>array1</code> followed
3548 * by all of the elements <code>array2</code>. When an array is returned, it is always
3549 * a new array.</p>
3550 *
3551 * <pre>
3552 * ArrayUtils.addAll(array1, null) = cloned copy of array1
3553 * ArrayUtils.addAll(null, array2) = cloned copy of array2
3554 * ArrayUtils.addAll([], []) = []
3555 * </pre>
3556 *
3557 * @param array1 the first array whose elements are added to the new array.
3558 * @param array2 the second array whose elements are added to the new array.
3559 * @return The new int[] array.
3560 * @since 2.1
3561 */
3562 public static int[] addAll(int[] array1, int[] array2) {
3563 if (array1 == null) {
3564 return clone(array2);
3565 } else if (array2 == null) {
3566 return clone(array1);
3567 }
3568 int[] joinedArray = new int[array1.length + array2.length];
3569 System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3570 System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3571 return joinedArray;
3572 }
3573
3574 /**
3575 * <p>Adds all the elements of the given arrays into a new array.</p>
3576 * <p>The new array contains all of the element of <code>array1</code> followed
3577 * by all of the elements <code>array2</code>. When an array is returned, it is always
3578 * a new array.</p>
3579 *
3580 * <pre>
3581 * ArrayUtils.addAll(array1, null) = cloned copy of array1
3582 * ArrayUtils.addAll(null, array2) = cloned copy of array2
3583 * ArrayUtils.addAll([], []) = []
3584 * </pre>
3585 *
3586 * @param array1 the first array whose elements are added to the new array.
3587 * @param array2 the second array whose elements are added to the new array.
3588 * @return The new long[] array.
3589 * @since 2.1
3590 */
3591 public static long[] addAll(long[] array1, long[] array2) {
3592 if (array1 == null) {
3593 return clone(array2);
3594 } else if (array2 == null) {
3595 return clone(array1);
3596 }
3597 long[] joinedArray = new long[array1.length + array2.length];
3598 System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3599 System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3600 return joinedArray;
3601 }
3602
3603 /**
3604 * <p>Adds all the elements of the given arrays into a new array.</p>
3605 * <p>The new array contains all of the element of <code>array1</code> followed
3606 * by all of the elements <code>array2</code>. When an array is returned, it is always
3607 * a new array.</p>
3608 *
3609 * <pre>
3610 * ArrayUtils.addAll(array1, null) = cloned copy of array1
3611 * ArrayUtils.addAll(null, array2) = cloned copy of array2
3612 * ArrayUtils.addAll([], []) = []
3613 * </pre>
3614 *
3615 * @param array1 the first array whose elements are added to the new array.
3616 * @param array2 the second array whose elements are added to the new array.
3617 * @return The new float[] array.
3618 * @since 2.1
3619 */
3620 public static float[] addAll(float[] array1, float[] array2) {
3621 if (array1 == null) {
3622 return clone(array2);
3623 } else if (array2 == null) {
3624 return clone(array1);
3625 }
3626 float[] joinedArray = new float[array1.length + array2.length];
3627 System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3628 System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3629 return joinedArray;
3630 }
3631
3632 /**
3633 * <p>Adds all the elements of the given arrays into a new array.</p>
3634 * <p>The new array contains all of the element of <code>array1</code> followed
3635 * by all of the elements <code>array2</code>. When an array is returned, it is always
3636 * a new array.</p>
3637 *
3638 * <pre>
3639 * ArrayUtils.addAll(array1, null) = cloned copy of array1
3640 * ArrayUtils.addAll(null, array2) = cloned copy of array2
3641 * ArrayUtils.addAll([], []) = []
3642 * </pre>
3643 *
3644 * @param array1 the first array whose elements are added to the new array.
3645 * @param array2 the second array whose elements are added to the new array.
3646 * @return The new double[] array.
3647 * @since 2.1
3648 */
3649 public static double[] addAll(double[] array1, double[] array2) {
3650 if (array1 == null) {
3651 return clone(array2);
3652 } else if (array2 == null) {
3653 return clone(array1);
3654 }
3655 double[] joinedArray = new double[array1.length + array2.length];
3656 System.arraycopy(array1, 0, joinedArray, 0, array1.length);
3657 System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
3658 return joinedArray;
3659 }
3660
3661 /**
3662 * <p>Copies the given array and adds the given element at the end of the new array.</p>
3663 *
3664 * <p>The new array contains the same elements of the input
3665 * array plus the given element in the last position. The component type of
3666 * the new array is the same as that of the input array.</p>
3667 *
3668 * <p>If the input array is <code>null</code>, a new one element array is returned
3669 * whose component type is the same as the element, unless the element itself is null,
3670 * in which case the return type is Object[]</p>
3671 *
3672 * <pre>
3673 * ArrayUtils.add(null, null) = [null]
3674 * ArrayUtils.add(null, "a") = ["a"]
3675 * ArrayUtils.add(["a"], null) = ["a", null]
3676 * ArrayUtils.add(["a"], "b") = ["a", "b"]
3677 * ArrayUtils.add(["a", "b"], "c") = ["a", "b", "c"]
3678 * </pre>
3679 *
3680 * @param array the array to "add" the element to, may be <code>null</code>
3681 * @param element the object to add, may be <code>null</code>
3682 * @return A new array containing the existing elements plus the new element
3683 * The returned array type will be that of the input array (unless null),
3684 * in which case it will have the same type as the element.
3685 * @since 2.1
3686 */
3687 public static Object[] add(Object[] array, Object element) {
3688 Class type;
3689 if (array != null){
3690 type = array.getClass();
3691 } else if (element != null) {
3692 type = element.getClass();
3693 } else {
3694 type = Object.class;
3695 }
3696 Object[] newArray = (Object[]) copyArrayGrow1(array, type);
3697 newArray[newArray.length - 1] = element;
3698 return newArray;
3699 }
3700
3701 /**
3702 * <p>Copies the given array and adds the given element at the end of the new array.</p>
3703 *
3704 * <p>The new array contains the same elements of the input
3705 * array plus the given element in the last position. The component type of
3706 * the new array is the same as that of the input array.</p>
3707 *
3708 * <p>If the input array is <code>null</code>, a new one element array is returned
3709 * whose component type is the same as the element.</p>
3710 *
3711 * <pre>
3712 * ArrayUtils.add(null, true) = [true]
3713 * ArrayUtils.add([true], false) = [true, false]
3714 * ArrayUtils.add([true, false], true) = [true, false, true]
3715 * </pre>
3716 *
3717 * @param array the array to copy and add the element to, may be <code>null</code>
3718 * @param element the object to add at the last index of the new array
3719 * @return A new array containing the existing elements plus the new element
3720 * @since 2.1
3721 */
3722 public static boolean[] add(boolean[] array, boolean element) {
3723 boolean[] newArray = (boolean[])copyArrayGrow1(array, Boolean.TYPE);
3724 newArray[newArray.length - 1] = element;
3725 return newArray;
3726 }
3727
3728 /**
3729 * <p>Copies the given array and adds the given element at the end of the new array.</p>
3730 *
3731 * <p>The new array contains the same elements of the input
3732 * array plus the given element in the last position. The component type of
3733 * the new array is the same as that of the input array.</p>
3734 *
3735 * <p>If the input array is <code>null</code>, a new one element array is returned
3736 * whose component type is the same as the element.</p>
3737 *
3738 * <pre>
3739 * ArrayUtils.add(null, 0) = [0]
3740 * ArrayUtils.add([1], 0) = [1, 0]
3741 * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3742 * </pre>
3743 *
3744 * @param array the array to copy and add the element to, may be <code>null</code>
3745 * @param element the object to add at the last index of the new array
3746 * @return A new array containing the existing elements plus the new element
3747 * @since 2.1
3748 */
3749 public static byte[] add(byte[] array, byte element) {
3750 byte[] newArray = (byte[])copyArrayGrow1(array, Byte.TYPE);
3751 newArray[newArray.length - 1] = element;
3752 return newArray;
3753 }
3754
3755 /**
3756 * <p>Copies the given array and adds the given element at the end of the new array.</p>
3757 *
3758 * <p>The new array contains the same elements of the input
3759 * array plus the given element in the last position. The component type of
3760 * the new array is the same as that of the input array.</p>
3761 *
3762 * <p>If the input array is <code>null</code>, a new one element array is returned
3763 * whose component type is the same as the element.</p>
3764 *
3765 * <pre>
3766 * ArrayUtils.add(null, '0') = ['0']
3767 * ArrayUtils.add(['1'], '0') = ['1', '0']
3768 * ArrayUtils.add(['1', '0'], '1') = ['1', '0', '1']
3769 * </pre>
3770 *
3771 * @param array the array to copy and add the element to, may be <code>null</code>
3772 * @param element the object to add at the last index of the new array
3773 * @return A new array containing the existing elements plus the new element
3774 * @since 2.1
3775 */
3776 public static char[] add(char[] array, char element) {
3777 char[] newArray = (char[])copyArrayGrow1(array, Character.TYPE);
3778 newArray[newArray.length - 1] = element;
3779 return newArray;
3780 }
3781
3782 /**
3783 * <p>Copies the given array and adds the given element at the end of the new array.</p>
3784 *
3785 * <p>The new array contains the same elements of the input
3786 * array plus the given element in the last position. The component type of
3787 * the new array is the same as that of the input array.</p>
3788 *
3789 * <p>If the input array is <code>null</code>, a new one element array is returned
3790 * whose component type is the same as the element.</p>
3791 *
3792 * <pre>
3793 * ArrayUtils.add(null, 0) = [0]
3794 * ArrayUtils.add([1], 0) = [1, 0]
3795 * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3796 * </pre>
3797 *
3798 * @param array the array to copy and add the element to, may be <code>null</code>
3799 * @param element the object to add at the last index of the new array
3800 * @return A new array containing the existing elements plus the new element
3801 * @since 2.1
3802 */
3803 public static double[] add(double[] array, double element) {
3804 double[] newArray = (double[])copyArrayGrow1(array, Double.TYPE);
3805 newArray[newArray.length - 1] = element;
3806 return newArray;
3807 }
3808
3809 /**
3810 * <p>Copies the given array and adds the given element at the end of the new array.</p>
3811 *
3812 * <p>The new array contains the same elements of the input
3813 * array plus the given element in the last position. The component type of
3814 * the new array is the same as that of the input array.</p>
3815 *
3816 * <p>If the input array is <code>null</code>, a new one element array is returned
3817 * whose component type is the same as the element.</p>
3818 *
3819 * <pre>
3820 * ArrayUtils.add(null, 0) = [0]
3821 * ArrayUtils.add([1], 0) = [1, 0]
3822 * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3823 * </pre>
3824 *
3825 * @param array the array to copy and add the element to, may be <code>null</code>
3826 * @param element the object to add at the last index of the new array
3827 * @return A new array containing the existing elements plus the new element
3828 * @since 2.1
3829 */
3830 public static float[] add(float[] array, float element) {
3831 float[] newArray = (float[])copyArrayGrow1(array, Float.TYPE);
3832 newArray[newArray.length - 1] = element;
3833 return newArray;
3834 }
3835
3836 /**
3837 * <p>Copies the given array and adds the given element at the end of the new array.</p>
3838 *
3839 * <p>The new array contains the same elements of the input
3840 * array plus the given element in the last position. The component type of
3841 * the new array is the same as that of the input array.</p>
3842 *
3843 * <p>If the input array is <code>null</code>, a new one element array is returned
3844 * whose component type is the same as the element.</p>
3845 *
3846 * <pre>
3847 * ArrayUtils.add(null, 0) = [0]
3848 * ArrayUtils.add([1], 0) = [1, 0]
3849 * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3850 * </pre>
3851 *
3852 * @param array the array to copy and add the element to, may be <code>null</code>
3853 * @param element the object to add at the last index of the new array
3854 * @return A new array containing the existing elements plus the new element
3855 * @since 2.1
3856 */
3857 public static int[] add(int[] array, int element) {
3858 int[] newArray = (int[])copyArrayGrow1(array, Integer.TYPE);
3859 newArray[newArray.length - 1] = element;
3860 return newArray;
3861 }
3862
3863 /**
3864 * <p>Copies the given array and adds the given element at the end of the new array.</p>
3865 *
3866 * <p>The new array contains the same elements of the input
3867 * array plus the given element in the last position. The component type of
3868 * the new array is the same as that of the input array.</p>
3869 *
3870 * <p>If the input array is <code>null</code>, a new one element array is returned
3871 * whose component type is the same as the element.</p>
3872 *
3873 * <pre>
3874 * ArrayUtils.add(null, 0) = [0]
3875 * ArrayUtils.add([1], 0) = [1, 0]
3876 * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3877 * </pre>
3878 *
3879 * @param array the array to copy and add the element to, may be <code>null</code>
3880 * @param element the object to add at the last index of the new array
3881 * @return A new array containing the existing elements plus the new element
3882 * @since 2.1
3883 */
3884 public static long[] add(long[] array, long element) {
3885 long[] newArray = (long[])copyArrayGrow1(array, Long.TYPE);
3886 newArray[newArray.length - 1] = element;
3887 return newArray;
3888 }
3889
3890 /**
3891 * <p>Copies the given array and adds the given element at the end of the new array.</p>
3892 *
3893 * <p>The new array contains the same elements of the input
3894 * array plus the given element in the last position. The component type of
3895 * the new array is the same as that of the input array.</p>
3896 *
3897 * <p>If the input array is <code>null</code>, a new one element array is returned
3898 * whose component type is the same as the element.</p>
3899 *
3900 * <pre>
3901 * ArrayUtils.add(null, 0) = [0]
3902 * ArrayUtils.add([1], 0) = [1, 0]
3903 * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
3904 * </pre>
3905 *
3906 * @param array the array to copy and add the element to, may be <code>null</code>
3907 * @param element the object to add at the last index of the new array
3908 * @return A new array containing the existing elements plus the new element
3909 * @since 2.1
3910 */
3911 public static short[] add(short[] array, short element) {
3912 short[] newArray = (short[])copyArrayGrow1(array, Short.TYPE);
3913 newArray[newArray.length - 1] = element;
3914 return newArray;
3915 }
3916
3917 /**
3918 * Returns a copy of the given array of size 1 greater than the argument.
3919 * The last value of the array is left to the default value.
3920 *
3921 * @param array The array to copy, must not be <code>null</code>.
3922 * @param newArrayComponentType If <code>array</code> is <code>null</code>, create a
3923 * size 1 array of this type.
3924 * @return A new copy of the array of size 1 greater than the input.
3925 */
3926 private static Object copyArrayGrow1(Object array, Class newArrayComponentType) {
3927 if (array != null) {
3928 int arrayLength = Array.getLength(array);
3929 Object newArray = Array.newInstance(array.getClass().getComponentType(), arrayLength + 1);
3930 System.arraycopy(array, 0, newArray, 0, arrayLength);
3931 return newArray;
3932 }
3933 return Array.newInstance(newArrayComponentType, 1);
3934 }
3935
3936 /**
3937 * <p>Inserts the specified element at the specified position in the array.
3938 * Shifts the element currently at that position (if any) and any subsequent
3939 * elements to the right (adds one to their indices).</p>
3940 *
3941 * <p>This method returns a new array with the same elements of the input
3942 * array plus the given element on the specified position. The component
3943 * type of the returned array is always the same as that of the input
3944 * array.</p>
3945 *
3946 * <p>If the input array is <code>null</code>, a new one element array is returned
3947 * whose component type is the same as the element.</p>
3948 *
3949 * <pre>
3950 * ArrayUtils.add(null, 0, null) = [null]
3951 * ArrayUtils.add(null, 0, "a") = ["a"]
3952 * ArrayUtils.add(["a"], 1, null) = ["a", null]
3953 * ArrayUtils.add(["a"], 1, "b") = ["a", "b"]
3954 * ArrayUtils.add(["a", "b"], 3, "c") = ["a", "b", "c"]
3955 * </pre>
3956 *
3957 * @param array the array to add the element to, may be <code>null</code>
3958 * @param index the position of the new object
3959 * @param element the object to add
3960 * @return A new array containing the existing elements and the new element
3961 * @throws IndexOutOfBoundsException if the index is out of range
3962 * (index < 0 || index > array.length).
3963 */
3964 public static Object[] add(Object[] array, int index, Object element) {
3965 Class clss = null;
3966 if (array != null) {
3967 clss = array.getClass().getComponentType();
3968 } else if (element != null) {
3969 clss = element.getClass();
3970 } else {
3971 return new Object[]{null};
3972 }
3973 return (Object[]) add(array, index, element, clss);
3974 }
3975
3976 /**
3977 * <p>Inserts the specified element at the specified position in the array.
3978 * Shifts the element currently at that position (if any) and any subsequent
3979 * elements to the right (adds one to their indices).</p>
3980 *
3981 * <p>This method returns a new array with the same elements of the input
3982 * array plus the given element on the specified position. The component
3983 * type of the returned array is always the same as that of the input
3984 * array.</p>
3985 *
3986 * <p>If the input array is <code>null</code>, a new one element array is returned
3987 * whose component type is the same as the element.</p>
3988 *
3989 * <pre>
3990 * ArrayUtils.add(null, 0, true) = [true]
3991 * ArrayUtils.add([true], 0, false) = [false, true]
3992 * ArrayUtils.add([false], 1, true) = [false, true]
3993 * ArrayUtils.add([true, false], 1, true) = [true, true, false]
3994 * </pre>
3995 *
3996 * @param array the array to add the element to, may be <code>null</code>
3997 * @param index the position of the new object
3998 * @param element the object to add
3999 * @return A new array containing the existing elements and the new element
4000 * @throws IndexOutOfBoundsException if the index is out of range
4001 * (index < 0 || index > array.length).
4002 */
4003 public static boolean[] add(boolean[] array, int index, boolean element) {
4004 return (boolean[]) add(array, index, BooleanUtils.toBooleanObject(element), Boolean.TYPE);
4005 }
4006
4007 /**
4008 * <p>Inserts the specified element at the specified position in the array.
4009 * Shifts the element currently at that position (if any) and any subsequent
4010 * elements to the right (adds one to their indices).</p>
4011 *
4012 * <p>This method returns a new array with the same elements of the input
4013 * array plus the given element on the specified position. The component
4014 * type of the returned array is always the same as that of the input
4015 * array.</p>
4016 *
4017 * <p>If the input array is <code>null</code>, a new one element array is returned
4018 * whose component type is the same as the element.</p>
4019 *
4020 * <pre>
4021 * ArrayUtils.add(null, 0, 'a') = ['a']
4022 * ArrayUtils.add(['a'], 0, 'b') = ['b', 'a']
4023 * ArrayUtils.add(['a', 'b'], 0, 'c') = ['c', 'a', 'b']
4024 * ArrayUtils.add(['a', 'b'], 1, 'k') = ['a', 'k', 'b']
4025 * ArrayUtils.add(['a', 'b', 'c'], 1, 't') = ['a', 't', 'b', 'c']
4026 * </pre>
4027 *
4028 * @param array the array to add the element to, may be <code>null</code>
4029 * @param index the position of the new object
4030 * @param element the object to add
4031 * @return A new array containing the existing elements and the new element
4032 * @throws IndexOutOfBoundsException if the index is out of range
4033 * (index < 0 || index > array.length).
4034 */
4035 public static char[] add(char[] array, int index, char element) {
4036 return (char[]) add(array, index, new Character(element), Character.TYPE);
4037 }
4038
4039 /**
4040 * <p>Inserts the specified element at the specified position in the array.
4041 * Shifts the element currently at that position (if any) and any subsequent
4042 * elements to the right (adds one to their indices).</p>
4043 *
4044 * <p>This method returns a new array with the same elements of the input
4045 * array plus the given element on the specified position. The component
4046 * type of the returned array is always the same as that of the input
4047 * array.</p>
4048 *
4049 * <p>If the input array is <code>null</code>, a new one element array is returned
4050 * whose component type is the same as the element.</p>
4051 *
4052 * <pre>
4053 * ArrayUtils.add([1], 0, 2) = [2, 1]
4054 * ArrayUtils.add([2, 6], 2, 3) = [2, 6, 3]
4055 * ArrayUtils.add([2, 6], 0, 1) = [1, 2, 6]
4056 * ArrayUtils.add([2, 6, 3], 2, 1) = [2, 6, 1, 3]
4057 * </pre>
4058 *
4059 * @param array the array to add the element to, may be <code>null</code>
4060 * @param index the position of the new object
4061 * @param element the object to add
4062 * @return A new array containing the existing elements and the new element
4063 * @throws IndexOutOfBoundsException if the index is out of range
4064 * (index < 0 || index > array.length).
4065 */
4066 public static byte[] add(byte[] array, int index, byte element) {
4067 return (byte[]) add(array, index, new Byte(element), Byte.TYPE);
4068 }
4069
4070 /**
4071 * <p>Inserts the specified element at the specified position in the array.
4072 * Shifts the element currently at that position (if any) and any subsequent
4073 * elements to the right (adds one to their indices).</p>
4074 *
4075 * <p>This method returns a new array with the same elements of the input
4076 * array plus the given element on the specified position. The component
4077 * type of the returned array is always the same as that of the input
4078 * array.</p>
4079 *
4080 * <p>If the input array is <code>null</code>, a new one element array is returned
4081 * whose component type is the same as the element.</p>
4082 *
4083 * <pre>
4084 * ArrayUtils.add([1], 0, 2) = [2, 1]
4085 * ArrayUtils.add([2, 6], 2, 10) = [2, 6, 10]
4086 * ArrayUtils.add([2, 6], 0, -4) = [-4, 2, 6]
4087 * ArrayUtils.add([2, 6, 3], 2, 1) = [2, 6, 1, 3]
4088 * </pre>
4089 *
4090 * @param array the array to add the element to, may be <code>null</code>
4091 * @param index the position of the new object
4092 * @param element the object to add
4093 * @return A new array containing the existing elements and the new element
4094 * @throws IndexOutOfBoundsException if the index is out of range
4095 * (index < 0 || index > array.length).
4096 */
4097 public static short[] add(short[] array, int index, short element) {
4098 return (short[]) add(array, index, new Short(element), Short.TYPE);
4099 }
4100
4101 /**
4102 * <p>Inserts the specified element at the specified position in the array.
4103 * Shifts the element currently at that position (if any) and any subsequent
4104 * elements to the right (adds one to their indices).</p>
4105 *
4106 * <p>This method returns a new array with the same elements of the input
4107 * array plus the given element on the specified position. The component
4108 * type of the returned array is always the same as that of the input
4109 * array.</p>
4110 *
4111 * <p>If the input array is <code>null</code>, a new one element array is returned
4112 * whose component type is the same as the element.</p>
4113 *
4114 * <pre>
4115 * ArrayUtils.add([1], 0, 2) = [2, 1]
4116 * ArrayUtils.add([2, 6], 2, 10) = [2, 6, 10]
4117 * ArrayUtils.add([2, 6], 0, -4) = [-4, 2, 6]
4118 * ArrayUtils.add([2, 6, 3], 2, 1) = [2, 6, 1, 3]
4119 * </pre>
4120 *
4121 * @param array the array to add the element to, may be <code>null</code>
4122 * @param index the position of the new object
4123 * @param element the object to add
4124 * @return A new array containing the existing elements and the new element
4125 * @throws IndexOutOfBoundsException if the index is out of range
4126 * (index < 0 || index > array.length).
4127 */
4128 public static int[] add(int[] array, int index, int element) {
4129 return (int[]) add(array, index, new Integer(element), Integer.TYPE);
4130 }
4131
4132 /**
4133 * <p>Inserts the specified element at the specified position in the array.
4134 * Shifts the element currently at that position (if any) and any subsequent
4135 * elements to the right (adds one to their indices).</p>
4136 *
4137 * <p>This method returns a new array with the same elements of the input
4138 * array plus the given element on the specified position. The component
4139 * type of the returned array is always the same as that of the input
4140 * array.</p>
4141 *
4142 * <p>If the input array is <code>null</code>, a new one element array is returned
4143 * whose component type is the same as the element.</p>
4144 *
4145 * <pre>
4146 * ArrayUtils.add([1L], 0, 2L) = [2L, 1L]
4147 * ArrayUtils.add([2L, 6L], 2, 10L) = [2L, 6L, 10L]
4148 * ArrayUtils.add([2L, 6L], 0, -4L) = [-4L, 2L, 6L]
4149 * ArrayUtils.add([2L, 6L, 3L], 2, 1L) = [2L, 6L, 1L, 3L]
4150 * </pre>
4151 *
4152 * @param array the array to add the element to, may be <code>null</code>
4153 * @param index the position of the new object
4154 * @param element the object to add
4155 * @return A new array containing the existing elements and the new element
4156 * @throws IndexOutOfBoundsException if the index is out of range
4157 * (index < 0 || index > array.length).
4158 */
4159 public static long[] add(long[] array, int index, long element) {
4160 return (long[]) add(array, index, new Long(element), Long.TYPE);
4161 }
4162
4163 /**
4164 * <p>Inserts the specified element at the specified position in the array.
4165 * Shifts the element currently at that position (if any) and any subsequent
4166 * elements to the right (adds one to their indices).</p>
4167 *
4168 * <p>This method returns a new array with the same elements of the input
4169 * array plus the given element on the specified position. The component
4170 * type of the returned array is always the same as that of the input
4171 * array.</p>
4172 *
4173 * <p>If the input array is <code>null</code>, a new one element array is returned
4174 * whose component type is the same as the element.</p>
4175 *
4176 * <pre>
4177 * ArrayUtils.add([1.1f], 0, 2.2f) = [2.2f, 1.1f]
4178 * ArrayUtils.add([2.3f, 6.4f], 2, 10.5f) = [2.3f, 6.4f, 10.5f]
4179 * ArrayUtils.add([2.6f, 6.7f], 0, -4.8f) = [-4.8f, 2.6f, 6.7f]
4180 * ArrayUtils.add([2.9f, 6.0f, 0.3f], 2, 1.0f) = [2.9f, 6.0f, 1.0f, 0.3f]
4181 * </pre>
4182 *
4183 * @param array the array to add the element to, may be <code>null</code>
4184 * @param index the position of the new object
4185 * @param element the object to add
4186 * @return A new array containing the existing elements and the new element
4187 * @throws IndexOutOfBoundsException if the index is out of range
4188 * (index < 0 || index > array.length).
4189 */
4190 public static float[] add(float[] array, int index, float element) {
4191 return (float[]) add(array, index, new Float(element), Float.TYPE);
4192 }
4193
4194 /**
4195 * <p>Inserts the specified element at the specified position in the array.
4196 * Shifts the element currently at that position (if any) and any subsequent
4197 * elements to the right (adds one to their indices).</p>
4198 *
4199 * <p>This method returns a new array with the same elements of the input
4200 * array plus the given element on the specified position. The component
4201 * type of the returned array is always the same as that of the input
4202 * array.</p>
4203 *
4204 * <p>If the input array is <code>null</code>, a new one element array is returned
4205 * whose component type is the same as the element.</p>
4206 *
4207 * <pre>
4208 * ArrayUtils.add([1.1], 0, 2.2) = [2.2, 1.1]
4209 * ArrayUtils.add([2.3, 6.4], 2, 10.5) = [2.3, 6.4, 10.5]
4210 * ArrayUtils.add([2.6, 6.7], 0, -4.8) = [-4.8, 2.6, 6.7]
4211 * ArrayUtils.add([2.9, 6.0, 0.3], 2, 1.0) = [2.9, 6.0, 1.0, 0.3]
4212 * </pre>
4213 *
4214 * @param array the array to add the element to, may be <code>null</code>
4215 * @param index the position of the new object
4216 * @param element the object to add
4217 * @return A new array containing the existing elements and the new element
4218 * @throws IndexOutOfBoundsException if the index is out of range
4219 * (index < 0 || index > array.length).
4220 */
4221 public static double[] add(double[] array, int index, double element) {
4222 return (double[]) add(array, index, new Double(element), Double.TYPE);
4223 }
4224
4225 /**
4226 * Underlying implementation of add(array, index, element) methods.
4227 * The last parameter is the class, which may not equal element.getClass
4228 * for primitives.
4229 *
4230 * @param array the array to add the element to, may be <code>null</code>
4231 * @param index the position of the new object
4232 * @param element the object to add
4233 * @param clss the type of the element being added
4234 * @return A new array containing the existing elements and the new element
4235 */
4236 private static Object add(Object array, int index, Object element, Class clss) {
4237 if (array == null) {
4238 if (index != 0) {
4239 throw new IndexOutOfBoundsException("Index: " + index + ", Length: 0");
4240 }
4241 Object joinedArray = Array.newInstance(clss, 1);
4242 Array.set(joinedArray, 0, element);
4243 return joinedArray;
4244 }
4245 int length = Array.getLength(array);
4246 if (index > length || index < 0) {
4247 throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
4248 }
4249 Object result = Array.newInstance(clss, length + 1);
4250 System.arraycopy(array, 0, result, 0, index);
4251 Array.set(result, index, element);
4252 if (index < length) {
4253 System.arraycopy(array, index, result, index + 1, length - index);
4254 }
4255 return result;
4256 }
4257
4258 /**
4259 * <p>Removes the element at the specified position from the specified array.
4260 * All subsequent elements are shifted to the left (substracts one from
4261 * their indices).</p>
4262 *
4263 * <p>This method returns a new array with the same elements of the input
4264 * array except the element on the specified position. The component
4265 * type of the returned array is always the same as that of the input
4266 * array.</p>
4267 *
4268 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4269 * will be thrown, because in that case no valid index can be specified.</p>
4270 *
4271 * <pre>
4272 * ArrayUtils.remove(["a"], 0) = []
4273 * ArrayUtils.remove(["a", "b"], 0) = ["b"]
4274 * ArrayUtils.remove(["a", "b"], 1) = ["a"]
4275 * ArrayUtils.remove(["a", "b", "c"], 1) = ["a", "c"]
4276 * </pre>
4277 *
4278 * @param array the array to remove the element from, may not be <code>null</code>
4279 * @param index the position of the element to be removed
4280 * @return A new array containing the existing elements except the element
4281 * at the specified position.
4282 * @throws IndexOutOfBoundsException if the index is out of range
4283 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4284 * @since 2.1
4285 */
4286 public static Object[] remove(Object[] array, int index) {
4287 return (Object[]) remove((Object) array, index);
4288 }
4289
4290 /**
4291 * <p>Removes the first occurrence of the specified element from the
4292 * specified array. All subsequent elements are shifted to the left
4293 * (substracts one from their indices). If the array doesn't contains
4294 * such an element, no elements are removed from the array.</p>
4295 *
4296 * <p>This method returns a new array with the same elements of the input
4297 * array except the first occurrence of the specified element. The component
4298 * type of the returned array is always the same as that of the input
4299 * array.</p>
4300 *
4301 * <pre>
4302 * ArrayUtils.removeElement(null, "a") = null
4303 * ArrayUtils.removeElement([], "a") = []
4304 * ArrayUtils.removeElement(["a"], "b") = ["a"]
4305 * ArrayUtils.removeElement(["a", "b"], "a") = ["b"]
4306 * ArrayUtils.removeElement(["a", "b", "a"], "a") = ["b", "a"]
4307 * </pre>
4308 *
4309 * @param array the array to remove the element from, may be <code>null</code>
4310 * @param element the element to be removed
4311 * @return A new array containing the existing elements except the first
4312 * occurrence of the specified element.
4313 * @since 2.1
4314 */
4315 public static Object[] removeElement(Object[] array, Object element) {
4316 int index = indexOf(array, element);
4317 if (index == INDEX_NOT_FOUND) {
4318 return clone(array);
4319 }
4320 return remove(array, index);
4321 }
4322
4323 /**
4324 * <p>Removes the element at the specified position from the specified array.
4325 * All subsequent elements are shifted to the left (substracts one from
4326 * their indices).</p>
4327 *
4328 * <p>This method returns a new array with the same elements of the input
4329 * array except the element on the specified position. The component
4330 * type of the returned array is always the same as that of the input
4331 * array.</p>
4332 *
4333 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4334 * will be thrown, because in that case no valid index can be specified.</p>
4335 *
4336 * <pre>
4337 * ArrayUtils.remove([true], 0) = []
4338 * ArrayUtils.remove([true, false], 0) = [false]
4339 * ArrayUtils.remove([true, false], 1) = [true]
4340 * ArrayUtils.remove([true, true, false], 1) = [true, false]
4341 * </pre>
4342 *
4343 * @param array the array to remove the element from, may not be <code>null</code>
4344 * @param index the position of the element to be removed
4345 * @return A new array containing the existing elements except the element
4346 * at the specified position.
4347 * @throws IndexOutOfBoundsException if the index is out of range
4348 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4349 * @since 2.1
4350 */
4351 public static boolean[] remove(boolean[] array, int index) {
4352 return (boolean[]) remove((Object) array, index);
4353 }
4354
4355 /**
4356 * <p>Removes the first occurrence of the specified element from the
4357 * specified array. All subsequent elements are shifted to the left
4358 * (substracts one from their indices). If the array doesn't contains
4359 * such an element, no elements are removed from the array.</p>
4360 *
4361 * <p>This method returns a new array with the same elements of the input
4362 * array except the first occurrence of the specified element. The component
4363 * type of the returned array is always the same as that of the input
4364 * array.</p>
4365 *
4366 * <pre>
4367 * ArrayUtils.removeElement(null, true) = null
4368 * ArrayUtils.removeElement([], true) = []
4369 * ArrayUtils.removeElement([true], false) = [true]
4370 * ArrayUtils.removeElement([true, false], false) = [true]
4371 * ArrayUtils.removeElement([true, false, true], true) = [false, true]
4372 * </pre>
4373 *
4374 * @param array the array to remove the element from, may be <code>null</code>
4375 * @param element the element to be removed
4376 * @return A new array containing the existing elements except the first
4377 * occurrence of the specified element.
4378 * @since 2.1
4379 */
4380 public static boolean[] removeElement(boolean[] array, boolean element) {
4381 int index = indexOf(array, element);
4382 if (index == INDEX_NOT_FOUND) {
4383 return clone(array);
4384 }
4385 return remove(array, index);
4386 }
4387
4388 /**
4389 * <p>Removes the element at the specified position from the specified array.
4390 * All subsequent elements are shifted to the left (substracts one from
4391 * their indices).</p>
4392 *
4393 * <p>This method returns a new array with the same elements of the input
4394 * array except the element on the specified position. The component
4395 * type of the returned array is always the same as that of the input
4396 * array.</p>
4397 *
4398 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4399 * will be thrown, because in that case no valid index can be specified.</p>
4400 *
4401 * <pre>
4402 * ArrayUtils.remove([1], 0) = []
4403 * ArrayUtils.remove([1, 0], 0) = [0]
4404 * ArrayUtils.remove([1, 0], 1) = [1]
4405 * ArrayUtils.remove([1, 0, 1], 1) = [1, 1]
4406 * </pre>
4407 *
4408 * @param array the array to remove the element from, may not be <code>null</code>
4409 * @param index the position of the element to be removed
4410 * @return A new array containing the existing elements except the element
4411 * at the specified position.
4412 * @throws IndexOutOfBoundsException if the index is out of range
4413 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4414 * @since 2.1
4415 */
4416 public static byte[] remove(byte[] array, int index) {
4417 return (byte[]) remove((Object) array, index);
4418 }
4419
4420 /**
4421 * <p>Removes the first occurrence of the specified element from the
4422 * specified array. All subsequent elements are shifted to the left
4423 * (substracts one from their indices). If the array doesn't contains
4424 * such an element, no elements are removed from the array.</p>
4425 *
4426 * <p>This method returns a new array with the same elements of the input
4427 * array except the first occurrence of the specified element. The component
4428 * type of the returned array is always the same as that of the input
4429 * array.</p>
4430 *
4431 * <pre>
4432 * ArrayUtils.removeElement(null, 1) = null
4433 * ArrayUtils.removeElement([], 1) = []
4434 * ArrayUtils.removeElement([1], 0) = [1]
4435 * ArrayUtils.removeElement([1, 0], 0) = [1]
4436 * ArrayUtils.removeElement([1, 0, 1], 1) = [0, 1]
4437 * </pre>
4438 *
4439 * @param array the array to remove the element from, may be <code>null</code>
4440 * @param element the element to be removed
4441 * @return A new array containing the existing elements except the first
4442 * occurrence of the specified element.
4443 * @since 2.1
4444 */
4445 public static byte[] removeElement(byte[] array, byte element) {
4446 int index = indexOf(array, element);
4447 if (index == INDEX_NOT_FOUND) {
4448 return clone(array);
4449 }
4450 return remove(array, index);
4451 }
4452
4453 /**
4454 * <p>Removes the element at the specified position from the specified array.
4455 * All subsequent elements are shifted to the left (substracts one from
4456 * their indices).</p>
4457 *
4458 * <p>This method returns a new array with the same elements of the input
4459 * array except the element on the specified position. The component
4460 * type of the returned array is always the same as that of the input
4461 * array.</p>
4462 *
4463 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4464 * will be thrown, because in that case no valid index can be specified.</p>
4465 *
4466 * <pre>
4467 * ArrayUtils.remove(['a'], 0) = []
4468 * ArrayUtils.remove(['a', 'b'], 0) = ['b']
4469 * ArrayUtils.remove(['a', 'b'], 1) = ['a']
4470 * ArrayUtils.remove(['a', 'b', 'c'], 1) = ['a', 'c']
4471 * </pre>
4472 *
4473 * @param array the array to remove the element from, may not be <code>null</code>
4474 * @param index the position of the element to be removed
4475 * @return A new array containing the existing elements except the element
4476 * at the specified position.
4477 * @throws IndexOutOfBoundsException if the index is out of range
4478 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4479 * @since 2.1
4480 */
4481 public static char[] remove(char[] array, int index) {
4482 return (char[]) remove((Object) array, index);
4483 }
4484
4485 /**
4486 * <p>Removes the first occurrence of the specified element from the
4487 * specified array. All subsequent elements are shifted to the left
4488 * (substracts one from their indices). If the array doesn't contains
4489 * such an element, no elements are removed from the array.</p>
4490 *
4491 * <p>This method returns a new array with the same elements of the input
4492 * array except the first occurrence of the specified element. The component
4493 * type of the returned array is always the same as that of the input
4494 * array.</p>
4495 *
4496 * <pre>
4497 * ArrayUtils.removeElement(null, 'a') = null
4498 * ArrayUtils.removeElement([], 'a') = []
4499 * ArrayUtils.removeElement(['a'], 'b') = ['a']
4500 * ArrayUtils.removeElement(['a', 'b'], 'a') = ['b']
4501 * ArrayUtils.removeElement(['a', 'b', 'a'], 'a') = ['b', 'a']
4502 * </pre>
4503 *
4504 * @param array the array to remove the element from, may be <code>null</code>
4505 * @param element the element to be removed
4506 * @return A new array containing the existing elements except the first
4507 * occurrence of the specified element.
4508 * @since 2.1
4509 */
4510 public static char[] removeElement(char[] array, char element) {
4511 int index = indexOf(array, element);
4512 if (index == INDEX_NOT_FOUND) {
4513 return clone(array);
4514 }
4515 return remove(array, index);
4516 }
4517
4518 /**
4519 * <p>Removes the element at the specified position from the specified array.
4520 * All subsequent elements are shifted to the left (substracts one from
4521 * their indices).</p>
4522 *
4523 * <p>This method returns a new array with the same elements of the input
4524 * array except the element on the specified position. The component
4525 * type of the returned array is always the same as that of the input
4526 * array.</p>
4527 *
4528 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4529 * will be thrown, because in that case no valid index can be specified.</p>
4530 *
4531 * <pre>
4532 * ArrayUtils.remove([1.1], 0) = []
4533 * ArrayUtils.remove([2.5, 6.0], 0) = [6.0]
4534 * ArrayUtils.remove([2.5, 6.0], 1) = [2.5]
4535 * ArrayUtils.remove([2.5, 6.0, 3.8], 1) = [2.5, 3.8]
4536 * </pre>
4537 *
4538 * @param array the array to remove the element from, may not be <code>null</code>
4539 * @param index the position of the element to be removed
4540 * @return A new array containing the existing elements except the element
4541 * at the specified position.
4542 * @throws IndexOutOfBoundsException if the index is out of range
4543 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4544 * @since 2.1
4545 */
4546 public static double[] remove(double[] array, int index) {
4547 return (double[]) remove((Object) array, index);
4548 }
4549
4550 /**
4551 * <p>Removes the first occurrence of the specified element from the
4552 * specified array. All subsequent elements are shifted to the left
4553 * (substracts one from their indices). If the array doesn't contains
4554 * such an element, no elements are removed from the array.</p>
4555 *
4556 * <p>This method returns a new array with the same elements of the input
4557 * array except the first occurrence of the specified element. The component
4558 * type of the returned array is always the same as that of the input
4559 * array.</p>
4560 *
4561 * <pre>
4562 * ArrayUtils.removeElement(null, 1.1) = null
4563 * ArrayUtils.removeElement([], 1.1) = []
4564 * ArrayUtils.removeElement([1.1], 1.2) = [1.1]
4565 * ArrayUtils.removeElement([1.1, 2.3], 1.1) = [2.3]
4566 * ArrayUtils.removeElement([1.1, 2.3, 1.1], 1.1) = [2.3, 1.1]
4567 * </pre>
4568 *
4569 * @param array the array to remove the element from, may be <code>null</code>
4570 * @param element the element to be removed
4571 * @return A new array containing the existing elements except the first
4572 * occurrence of the specified element.
4573 * @since 2.1
4574 */
4575 public static double[] removeElement(double[] array, double element) {
4576 int index = indexOf(array, element);
4577 if (index == INDEX_NOT_FOUND) {
4578 return clone(array);
4579 }
4580 return remove(array, index);
4581 }
4582
4583 /**
4584 * <p>Removes the element at the specified position from the specified array.
4585 * All subsequent elements are shifted to the left (substracts one from
4586 * their indices).</p>
4587 *
4588 * <p>This method returns a new array with the same elements of the input
4589 * array except the element on the specified position. The component
4590 * type of the returned array is always the same as that of the input
4591 * array.</p>
4592 *
4593 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4594 * will be thrown, because in that case no valid index can be specified.</p>
4595 *
4596 * <pre>
4597 * ArrayUtils.remove([1.1], 0) = []
4598 * ArrayUtils.remove([2.5, 6.0], 0) = [6.0]
4599 * ArrayUtils.remove([2.5, 6.0], 1) = [2.5]
4600 * ArrayUtils.remove([2.5, 6.0, 3.8], 1) = [2.5, 3.8]
4601 * </pre>
4602 *
4603 * @param array the array to remove the element from, may not be <code>null</code>
4604 * @param index the position of the element to be removed
4605 * @return A new array containing the existing elements except the element
4606 * at the specified position.
4607 * @throws IndexOutOfBoundsException if the index is out of range
4608 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4609 * @since 2.1
4610 */
4611 public static float[] remove(float[] array, int index) {
4612 return (float[]) remove((Object) array, index);
4613 }
4614
4615 /**
4616 * <p>Removes the first occurrence of the specified element from the
4617 * specified array. All subsequent elements are shifted to the left
4618 * (substracts one from their indices). If the array doesn't contains
4619 * such an element, no elements are removed from the array.</p>
4620 *
4621 * <p>This method returns a new array with the same elements of the input
4622 * array except the first occurrence of the specified element. The component
4623 * type of the returned array is always the same as that of the input
4624 * array.</p>
4625 *
4626 * <pre>
4627 * ArrayUtils.removeElement(null, 1.1) = null
4628 * ArrayUtils.removeElement([], 1.1) = []
4629 * ArrayUtils.removeElement([1.1], 1.2) = [1.1]
4630 * ArrayUtils.removeElement([1.1, 2.3], 1.1) = [2.3]
4631 * ArrayUtils.removeElement([1.1, 2.3, 1.1], 1.1) = [2.3, 1.1]
4632 * </pre>
4633 *
4634 * @param array the array to remove the element from, may be <code>null</code>
4635 * @param element the element to be removed
4636 * @return A new array containing the existing elements except the first
4637 * occurrence of the specified element.
4638 * @since 2.1
4639 */
4640 public static float[] removeElement(float[] array, float element) {
4641 int index = indexOf(array, element);
4642 if (index == INDEX_NOT_FOUND) {
4643 return clone(array);
4644 }
4645 return remove(array, index);
4646 }
4647
4648 /**
4649 * <p>Removes the element at the specified position from the specified array.
4650 * All subsequent elements are shifted to the left (substracts one from
4651 * their indices).</p>
4652 *
4653 * <p>This method returns a new array with the same elements of the input
4654 * array except the element on the specified position. The component
4655 * type of the returned array is always the same as that of the input
4656 * array.</p>
4657 *
4658 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4659 * will be thrown, because in that case no valid index can be specified.</p>
4660 *
4661 * <pre>
4662 * ArrayUtils.remove([1], 0) = []
4663 * ArrayUtils.remove([2, 6], 0) = [6]
4664 * ArrayUtils.remove([2, 6], 1) = [2]
4665 * ArrayUtils.remove([2, 6, 3], 1) = [2, 3]
4666 * </pre>
4667 *
4668 * @param array the array to remove the element from, may not be <code>null</code>
4669 * @param index the position of the element to be removed
4670 * @return A new array containing the existing elements except the element
4671 * at the specified position.
4672 * @throws IndexOutOfBoundsException if the index is out of range
4673 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4674 * @since 2.1
4675 */
4676 public static int[] remove(int[] array, int index) {
4677 return (int[]) remove((Object) array, index);
4678 }
4679
4680 /**
4681 * <p>Removes the first occurrence of the specified element from the
4682 * specified array. All subsequent elements are shifted to the left
4683 * (substracts one from their indices). If the array doesn't contains
4684 * such an element, no elements are removed from the array.</p>
4685 *
4686 * <p>This method returns a new array with the same elements of the input
4687 * array except the first occurrence of the specified element. The component
4688 * type of the returned array is always the same as that of the input
4689 * array.</p>
4690 *
4691 * <pre>
4692 * ArrayUtils.removeElement(null, 1) = null
4693 * ArrayUtils.removeElement([], 1) = []
4694 * ArrayUtils.removeElement([1], 2) = [1]
4695 * ArrayUtils.removeElement([1, 3], 1) = [3]
4696 * ArrayUtils.removeElement([1, 3, 1], 1) = [3, 1]
4697 * </pre>
4698 *
4699 * @param array the array to remove the element from, may be <code>null</code>
4700 * @param element the element to be removed
4701 * @return A new array containing the existing elements except the first
4702 * occurrence of the specified element.
4703 * @since 2.1
4704 */
4705 public static int[] removeElement(int[] array, int element) {
4706 int index = indexOf(array, element);
4707 if (index == INDEX_NOT_FOUND) {
4708 return clone(array);
4709 }
4710 return remove(array, index);
4711 }
4712
4713 /**
4714 * <p>Removes the element at the specified position from the specified array.
4715 * All subsequent elements are shifted to the left (substracts one from
4716 * their indices).</p>
4717 *
4718 * <p>This method returns a new array with the same elements of the input
4719 * array except the element on the specified position. The component
4720 * type of the returned array is always the same as that of the input
4721 * array.</p>
4722 *
4723 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4724 * will be thrown, because in that case no valid index can be specified.</p>
4725 *
4726 * <pre>
4727 * ArrayUtils.remove([1], 0) = []
4728 * ArrayUtils.remove([2, 6], 0) = [6]
4729 * ArrayUtils.remove([2, 6], 1) = [2]
4730 * ArrayUtils.remove([2, 6, 3], 1) = [2, 3]
4731 * </pre>
4732 *
4733 * @param array the array to remove the element from, may not be <code>null</code>
4734 * @param index the position of the element to be removed
4735 * @return A new array containing the existing elements except the element
4736 * at the specified position.
4737 * @throws IndexOutOfBoundsException if the index is out of range
4738 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4739 * @since 2.1
4740 */
4741 public static long[] remove(long[] array, int index) {
4742 return (long[]) remove((Object) array, index);
4743 }
4744
4745 /**
4746 * <p>Removes the first occurrence of the specified element from the
4747 * specified array. All subsequent elements are shifted to the left
4748 * (substracts one from their indices). If the array doesn't contains
4749 * such an element, no elements are removed from the array.</p>
4750 *
4751 * <p>This method returns a new array with the same elements of the input
4752 * array except the first occurrence of the specified element. The component
4753 * type of the returned array is always the same as that of the input
4754 * array.</p>
4755 *
4756 * <pre>
4757 * ArrayUtils.removeElement(null, 1) = null
4758 * ArrayUtils.removeElement([], 1) = []
4759 * ArrayUtils.removeElement([1], 2) = [1]
4760 * ArrayUtils.removeElement([1, 3], 1) = [3]
4761 * ArrayUtils.removeElement([1, 3, 1], 1) = [3, 1]
4762 * </pre>
4763 *
4764 * @param array the array to remove the element from, may be <code>null</code>
4765 * @param element the element to be removed
4766 * @return A new array containing the existing elements except the first
4767 * occurrence of the specified element.
4768 * @since 2.1
4769 */
4770 public static long[] removeElement(long[] array, long element) {
4771 int index = indexOf(array, element);
4772 if (index == INDEX_NOT_FOUND) {
4773 return clone(array);
4774 }
4775 return remove(array, index);
4776 }
4777
4778 /**
4779 * <p>Removes the element at the specified position from the specified array.
4780 * All subsequent elements are shifted to the left (substracts one from
4781 * their indices).</p>
4782 *
4783 * <p>This method returns a new array with the same elements of the input
4784 * array except the element on the specified position. The component
4785 * type of the returned array is always the same as that of the input
4786 * array.</p>
4787 *
4788 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4789 * will be thrown, because in that case no valid index can be specified.</p>
4790 *
4791 * <pre>
4792 * ArrayUtils.remove([1], 0) = []
4793 * ArrayUtils.remove([2, 6], 0) = [6]
4794 * ArrayUtils.remove([2, 6], 1) = [2]
4795 * ArrayUtils.remove([2, 6, 3], 1) = [2, 3]
4796 * </pre>
4797 *
4798 * @param array the array to remove the element from, may not be <code>null</code>
4799 * @param index the position of the element to be removed
4800 * @return A new array containing the existing elements except the element
4801 * at the specified position.
4802 * @throws IndexOutOfBoundsException if the index is out of range
4803 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4804 * @since 2.1
4805 */
4806 public static short[] remove(short[] array, int index) {
4807 return (short[]) remove((Object) array, index);
4808 }
4809
4810 /**
4811 * <p>Removes the first occurrence of the specified element from the
4812 * specified array. All subsequent elements are shifted to the left
4813 * (substracts one from their indices). If the array doesn't contains
4814 * such an element, no elements are removed from the array.</p>
4815 *
4816 * <p>This method returns a new array with the same elements of the input
4817 * array except the first occurrence of the specified element. The component
4818 * type of the returned array is always the same as that of the input
4819 * array.</p>
4820 *
4821 * <pre>
4822 * ArrayUtils.removeElement(null, 1) = null
4823 * ArrayUtils.removeElement([], 1) = []
4824 * ArrayUtils.removeElement([1], 2) = [1]
4825 * ArrayUtils.removeElement([1, 3], 1) = [3]
4826 * ArrayUtils.removeElement([1, 3, 1], 1) = [3, 1]
4827 * </pre>
4828 *
4829 * @param array the array to remove the element from, may be <code>null</code>
4830 * @param element the element to be removed
4831 * @return A new array containing the existing elements except the first
4832 * occurrence of the specified element.
4833 * @since 2.1
4834 */
4835 public static short[] removeElement(short[] array, short element) {
4836 int index = indexOf(array, element);
4837 if (index == INDEX_NOT_FOUND) {
4838 return clone(array);
4839 }
4840 return remove(array, index);
4841 }
4842
4843 /**
4844 * <p>Removes the element at the specified position from the specified array.
4845 * All subsequent elements are shifted to the left (substracts one from
4846 * their indices).</p>
4847 *
4848 * <p>This method returns a new array with the same elements of the input
4849 * array except the element on the specified position. The component
4850 * type of the returned array is always the same as that of the input
4851 * array.</p>
4852 *
4853 * <p>If the input array is <code>null</code>, an IndexOutOfBoundsException
4854 * will be thrown, because in that case no valid index can be specified.</p>
4855 *
4856 * @param array the array to remove the element from, may not be <code>null</code>
4857 * @param index the position of the element to be removed
4858 * @return A new array containing the existing elements except the element
4859 * at the specified position.
4860 * @throws IndexOutOfBoundsException if the index is out of range
4861 * (index < 0 || index >= array.length), or if the array is <code>null</code>.
4862 * @since 2.1
4863 */
4864 private static Object remove(Object array, int index) {
4865 int length = getLength(array);
4866 if (index < 0 || index >= length) {
4867 throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
4868 }
4869
4870 Object result = Array.newInstance(array.getClass().getComponentType(), length - 1);
4871 System.arraycopy(array, 0, result, 0, index);
4872 if (index < length - 1) {
4873 System.arraycopy(array, index + 1, result, index, length - index - 1);
4874 }
4875
4876 return result;
4877 }
4878
4879}
Note: See TracBrowser for help on using the repository browser.