/** * Copyright 2013-2016 Guoqiang Chen, Shanghai, China. All rights reserved. * * Author: Guoqiang Chen * Email: subchen@gmail.com * WebURL: https://github.com/subchen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrick.util; import java.io.File; import java.net.URL; import java.util.Arrays; import java.util.Date; public final class ArrayUtils { public static final boolean[] EMPTY_BOOLEAN_ARRAY = new boolean[0]; public static final char[] EMPTY_CHAR_ARRAY = new char[0]; public static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; public static final short[] EMPTY_SHORT_ARRAY = new short[0]; public static final int[] EMPTY_INT_ARRAY = new int[0]; public static final long[] EMPTY_LONG_ARRAY = new long[0]; public static final float[] EMPTY_FLOAT_ARRAY = new float[0]; public static final double[] EMPTY_DOUBLE_ARRAY = new double[0]; public static final Boolean[] EMPTY_BOOLEAN_OBJECT_ARRAY = new Boolean[0]; public static final Character[] EMPTY_CHARACTER_OBJECT_ARRAY = new Character[0]; public static final Byte[] EMPTY_BYTE_OBJECT_ARRAY = new Byte[0]; public static final Short[] EMPTY_SHORT_OBJECT_ARRAY = new Short[0]; public static final Integer[] EMPTY_INTEGER_OBJECT_ARRAY = new Integer[0]; public static final Long[] EMPTY_LONG_OBJECT_ARRAY = new Long[0]; public static final Float[] EMPTY_FLOAT_OBJECT_ARRAY = new Float[0]; public static final Double[] EMPTY_DOUBLE_OBJECT_ARRAY = new Double[0]; public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0]; public static final String[] EMPTY_STRING_ARRAY = new String[0]; public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0]; public static final Date[] EMPTY_DATE_ARRAY = new Date[0]; public static final java.sql.Date[] EMPTY_SQL_DATE_ARRAY = new java.sql.Date[0]; public static final java.sql.Time[] EMPTY_SQL_TIME_ARRAY = new java.sql.Time[0]; public static final java.sql.Timestamp[] EMPTY_SQL_TIMESTAMP_ARRAY = new java.sql.Timestamp[0]; public static final File[] EMPTY_FILE_ARRAY = new File[0]; public static final URL[] EMPTY_URL_ARRAY = new URL[0]; public static final int INDEX_NOT_FOUND = -1; public static boolean contains(boolean[] array, boolean valueToFind) { return indexOf(array, valueToFind) != -1; } public static boolean contains(byte[] array, byte valueToFind) { return indexOf(array, valueToFind) != -1; } public static boolean contains(char[] array, char valueToFind) { return indexOf(array, valueToFind) != -1; } public static boolean contains(double[] array, double valueToFind) { return indexOf(array, valueToFind) != -1; } public static boolean contains(double[] array, double valueToFind, double tolerance) { return indexOf(array, valueToFind, 0, tolerance) != -1; } public static boolean contains(float[] array, float valueToFind) { return indexOf(array, valueToFind) != -1; } public static boolean contains(int[] array, int valueToFind) { return indexOf(array, valueToFind) != -1; } public static boolean contains(long[] array, long valueToFind) { return indexOf(array, valueToFind) != -1; } public static boolean contains(Object[] array, Object objectToFind) { return indexOf(array, objectToFind) != -1; } public static boolean contains(short[] array, short valueToFind) { return indexOf(array, valueToFind) != -1; } public static int indexOf(boolean[] array, boolean valueToFind) { return indexOf(array, valueToFind, 0); } public static int indexOf(boolean[] array, boolean valueToFind, int startIndex) { if (array == null || array.length == 0) { return -1; } if (startIndex < 0) { startIndex = 0; } for (int i = startIndex; i < array.length; i++) { if (valueToFind == array[i]) { return i; } } return -1; } public static int indexOf(byte[] array, byte valueToFind) { return indexOf(array, valueToFind, 0); } public static int indexOf(byte[] array, byte valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { startIndex = 0; } for (int i = startIndex; i < array.length; i++) { if (valueToFind == array[i]) { return i; } } return -1; } public static int indexOf(char[] array, char valueToFind) { return indexOf(array, valueToFind, 0); } public static int indexOf(char[] array, char valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { startIndex = 0; } for (int i = startIndex; i < array.length; i++) { if (valueToFind == array[i]) { return i; } } return -1; } public static int indexOf(double[] array, double valueToFind) { return indexOf(array, valueToFind, 0); } public static int indexOf(double[] array, double valueToFind, double tolerance) { return indexOf(array, valueToFind, 0, tolerance); } public static int indexOf(double[] array, double valueToFind, int startIndex) { if (array == null || array.length == 0) { return -1; } if (startIndex < 0) { startIndex = 0; } for (int i = startIndex; i < array.length; i++) { if (valueToFind == array[i]) { return i; } } return -1; } public static int indexOf(double[] array, double valueToFind, int startIndex, double tolerance) { if (array == null || array.length == 0) { return -1; } if (startIndex < 0) { startIndex = 0; } double min = valueToFind - tolerance; double max = valueToFind + tolerance; for (int i = startIndex; i < array.length; i++) { if ((array[i] >= min) && (array[i] <= max)) { return i; } } return -1; } public static int indexOf(float[] array, float valueToFind) { return indexOf(array, valueToFind, 0); } public static int indexOf(float[] array, float valueToFind, int startIndex) { if (array == null || array.length == 0) { return -1; } if (startIndex < 0) { startIndex = 0; } for (int i = startIndex; i < array.length; i++) { if (valueToFind == array[i]) { return i; } } return -1; } public static int indexOf(int[] array, int valueToFind) { return indexOf(array, valueToFind, 0); } public static int indexOf(int[] array, int valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { startIndex = 0; } for (int i = startIndex; i < array.length; i++) { if (valueToFind == array[i]) { return i; } } return -1; } public static int indexOf(long[] array, long valueToFind) { return indexOf(array, valueToFind, 0); } public static int indexOf(long[] array, long valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { startIndex = 0; } for (int i = startIndex; i < array.length; i++) { if (valueToFind == array[i]) { return i; } } return -1; } public static int indexOf(Object[] array, Object objectToFind) { return indexOf(array, objectToFind, 0); } public static int indexOf(Object[] array, Object objectToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { startIndex = 0; } if (objectToFind == null) { for (int i = startIndex; i < array.length; i++) { if (array[i] == null) return i; } } else if (array.getClass().getComponentType().isInstance(objectToFind)) { for (int i = startIndex; i < array.length; i++) { if (objectToFind.equals(array[i])) { return i; } } } return -1; } public static int indexOf(short[] array, short valueToFind) { return indexOf(array, valueToFind, 0); } public static int indexOf(short[] array, short valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { startIndex = 0; } for (int i = startIndex; i < array.length; i++) { if (valueToFind == array[i]) { return i; } } return -1; } public static int lastIndexOf(boolean[] array, boolean valueToFind) { return lastIndexOf(array, valueToFind, 2147483647); } public static int lastIndexOf(boolean[] array, boolean valueToFind, int startIndex) { if (array == null || array.length == 0) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (valueToFind == array[i]) { return i; } } return -1; } public static int lastIndexOf(byte[] array, byte valueToFind) { return lastIndexOf(array, valueToFind, 2147483647); } public static int lastIndexOf(byte[] array, byte valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (valueToFind == array[i]) { return i; } } return -1; } public static int lastIndexOf(char[] array, char valueToFind) { return lastIndexOf(array, valueToFind, 2147483647); } public static int lastIndexOf(char[] array, char valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (valueToFind == array[i]) { return i; } } return -1; } public static int lastIndexOf(double[] array, double valueToFind) { return lastIndexOf(array, valueToFind, 2147483647); } public static int lastIndexOf(double[] array, double valueToFind, double tolerance) { return lastIndexOf(array, valueToFind, 2147483647, tolerance); } public static int lastIndexOf(double[] array, double valueToFind, int startIndex) { if (array == null || array.length == 0) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (valueToFind == array[i]) { return i; } } return -1; } public static int lastIndexOf(double[] array, double valueToFind, int startIndex, double tolerance) { if (array == null || array.length == 0) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } double min = valueToFind - tolerance; double max = valueToFind + tolerance; for (int i = startIndex; i >= 0; i--) { if ((array[i] >= min) && (array[i] <= max)) { return i; } } return -1; } public static int lastIndexOf(float[] array, float valueToFind) { return lastIndexOf(array, valueToFind, 2147483647); } public static int lastIndexOf(float[] array, float valueToFind, int startIndex) { if (array == null || array.length == 0) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (valueToFind == array[i]) { return i; } } return -1; } public static int lastIndexOf(int[] array, int valueToFind) { return lastIndexOf(array, valueToFind, 2147483647); } public static int lastIndexOf(int[] array, int valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (valueToFind == array[i]) { return i; } } return -1; } public static int lastIndexOf(long[] array, long valueToFind) { return lastIndexOf(array, valueToFind, 2147483647); } public static int lastIndexOf(long[] array, long valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (valueToFind == array[i]) { return i; } } return -1; } public static int lastIndexOf(Object[] array, Object objectToFind) { return lastIndexOf(array, objectToFind, 2147483647); } public static int lastIndexOf(Object[] array, Object objectToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } if (objectToFind == null) { for (int i = startIndex; i >= 0; i--) { if (array[i] == null) return i; } } else if (array.getClass().getComponentType().isInstance(objectToFind)) { for (int i = startIndex; i >= 0; i--) { if (objectToFind.equals(array[i])) { return i; } } } return -1; } public static int lastIndexOf(short[] array, short valueToFind) { return lastIndexOf(array, valueToFind, 2147483647); } public static int lastIndexOf(short[] array, short valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) return -1; if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (valueToFind == array[i]) { return i; } } return -1; } public static Boolean[] toObject(boolean[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_BOOLEAN_OBJECT_ARRAY; } Boolean[] result = new Boolean[array.length]; for (int i = 0; i < array.length; i++) { result[i] = Boolean.valueOf(array[i]); } return result; } public static Byte[] toObject(byte[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_BYTE_OBJECT_ARRAY; } Byte[] result = new Byte[array.length]; for (int i = 0; i < array.length; i++) { result[i] = Byte.valueOf(array[i]); } return result; } public static Character[] toObject(char[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_CHARACTER_OBJECT_ARRAY; } Character[] result = new Character[array.length]; for (int i = 0; i < array.length; i++) { result[i] = Character.valueOf(array[i]); } return result; } public static Double[] toObject(double[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_DOUBLE_OBJECT_ARRAY; } Double[] result = new Double[array.length]; for (int i = 0; i < array.length; i++) { result[i] = Double.valueOf(array[i]); } return result; } public static Float[] toObject(float[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_FLOAT_OBJECT_ARRAY; } Float[] result = new Float[array.length]; for (int i = 0; i < array.length; i++) { result[i] = Float.valueOf(array[i]); } return result; } public static Integer[] toObject(int[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_INTEGER_OBJECT_ARRAY; } Integer[] result = new Integer[array.length]; for (int i = 0; i < array.length; i++) { result[i] = Integer.valueOf(array[i]); } return result; } public static Long[] toObject(long[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_LONG_OBJECT_ARRAY; } Long[] result = new Long[array.length]; for (int i = 0; i < array.length; i++) { result[i] = Long.valueOf(array[i]); } return result; } public static Short[] toObject(short[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_SHORT_OBJECT_ARRAY; } Short[] result = new Short[array.length]; for (int i = 0; i < array.length; i++) { result[i] = Short.valueOf(array[i]); } return result; } public static boolean[] toPrimitive(Boolean[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_BOOLEAN_ARRAY; } boolean[] result = new boolean[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].booleanValue(); } return result; } public static boolean[] toPrimitive(Boolean[] array, boolean valueForNull) { if (array == null) return null; if (array.length == 0) { return EMPTY_BOOLEAN_ARRAY; } boolean[] result = new boolean[array.length]; for (int i = 0; i < array.length; i++) { Boolean b = array[i]; result[i] = (b == null ? valueForNull : b.booleanValue()); } return result; } public static byte[] toPrimitive(Byte[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_BYTE_ARRAY; } byte[] result = new byte[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].byteValue(); } return result; } public static byte[] toPrimitive(Byte[] array, byte valueForNull) { if (array == null) return null; if (array.length == 0) { return EMPTY_BYTE_ARRAY; } byte[] result = new byte[array.length]; for (int i = 0; i < array.length; i++) { Byte b = array[i]; result[i] = (b == null ? valueForNull : b.byteValue()); } return result; } public static char[] toPrimitive(Character[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_CHAR_ARRAY; } char[] result = new char[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].charValue(); } return result; } public static char[] toPrimitive(Character[] array, char valueForNull) { if (array == null) return null; if (array.length == 0) { return EMPTY_CHAR_ARRAY; } char[] result = new char[array.length]; for (int i = 0; i < array.length; i++) { Character b = array[i]; result[i] = (b == null ? valueForNull : b.charValue()); } return result; } public static double[] toPrimitive(Double[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_DOUBLE_ARRAY; } double[] result = new double[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].doubleValue(); } return result; } public static double[] toPrimitive(Double[] array, double valueForNull) { if (array == null) return null; if (array.length == 0) { return EMPTY_DOUBLE_ARRAY; } double[] result = new double[array.length]; for (int i = 0; i < array.length; i++) { Double b = array[i]; result[i] = (b == null ? valueForNull : b.doubleValue()); } return result; } public static float[] toPrimitive(Float[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_FLOAT_ARRAY; } float[] result = new float[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].floatValue(); } return result; } public static float[] toPrimitive(Float[] array, float valueForNull) { if (array == null) return null; if (array.length == 0) { return EMPTY_FLOAT_ARRAY; } float[] result = new float[array.length]; for (int i = 0; i < array.length; i++) { Float b = array[i]; result[i] = (b == null ? valueForNull : b.floatValue()); } return result; } public static int[] toPrimitive(Integer[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_INT_ARRAY; } int[] result = new int[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].intValue(); } return result; } public static int[] toPrimitive(Integer[] array, int valueForNull) { if (array == null) return null; if (array.length == 0) { return EMPTY_INT_ARRAY; } int[] result = new int[array.length]; for (int i = 0; i < array.length; i++) { Integer b = array[i]; result[i] = (b == null ? valueForNull : b.intValue()); } return result; } public static long[] toPrimitive(Long[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_LONG_ARRAY; } long[] result = new long[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].longValue(); } return result; } public static long[] toPrimitive(Long[] array, long valueForNull) { if (array == null) return null; if (array.length == 0) { return EMPTY_LONG_ARRAY; } long[] result = new long[array.length]; for (int i = 0; i < array.length; i++) { Long b = array[i]; result[i] = (b == null ? valueForNull : b.longValue()); } return result; } public static short[] toPrimitive(Short[] array) { if (array == null) return null; if (array.length == 0) { return EMPTY_SHORT_ARRAY; } short[] result = new short[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].shortValue(); } return result; } public static short[] toPrimitive(Short[] array, short valueForNull) { if (array == null) return null; if (array.length == 0) { return EMPTY_SHORT_ARRAY; } short[] result = new short[array.length]; for (int i = 0; i < array.length; i++) { Short b = array[i]; result[i] = (b == null ? valueForNull : b.shortValue()); } return result; } public static String toString(Object array) { if (array == null) { return null; } Class<?> type = array.getClass(); if (type.isArray()) { if (type.getComponentType().isPrimitive()) { if (type == byte[].class) { byte[] valueArray = (byte[]) array; // using default encoding return new String(valueArray, 0, valueArray.length); } if (type == char[].class) { char[] charArray = (char[]) array; return new String(charArray); } if (type == short[].class) { return Arrays.toString((short[]) array); } if (type == int[].class) { return Arrays.toString((int[]) array); } if (type == long[].class) { return Arrays.toString((long[]) array); } if (type == float[].class) { return Arrays.toString((float[]) array); } if (type == double[].class) { return Arrays.toString((double[]) array); } if (type == boolean[].class) { return Arrays.toString((boolean[]) array); } } else { return Arrays.toString((Object[]) array); } } return array.toString(); } }