All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jlibs.core.lang.ArrayUtil Maven / Gradle / Ivy

There is a newer version: 3.0.1
Show newest version
/**
 * Copyright 2015 Santhosh Kumar Tekuri
 *
 * The JLibs authors license this file to you 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 jlibs.core.lang;

import jlibs.core.graph.Filter;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author Santhosh Kumar T
 */
public class ArrayUtil{

    /*-------------------------------------------------[ Finding Item ]---------------------------------------------------*/

    /**
     * returns first index of item in given array starting
     * from fromIndex(inclusive)
     *
     * @param array     object array, can be null
     * @param item      item to be searched, can be null
     * @param fromIndex index(inclusive) from which search happens.
     * @return          -1 if array is null, or the item is not found
     *                  otherwize returns first index of item in array
     */
    public static  int indexOf(T array[], S item, int fromIndex){
        if(array==null)
            return -1;

        for(int i=fromIndex; i int indexOf(T array[], S item){
        return indexOf(array, item, 0);
    }

    /**
     * tells whether the array contains the given item
     *
     * @param array     object array, can be null
     * @param item      item to be searched, can be null
     * @return          false if array is null, or item is not found
     *                  otherwize returns true;
     */
    public static  boolean contains(T array[], S item){
        return indexOf(array, item)!=-1;
    }

    /*-------------------------------------------------[ Boundary Items ]---------------------------------------------------*/

    /**
     * Returns first element in given {@code array}.
     * 

* if {@code array} is null or of length zero, then returns {@code null} */ public static T getFirst(T array[]){ return array!=null && array.length>0 ? array[0] : null; } /** * Returns last element in given {@code array}. *

* if {@code array} is null or of length zero, then returns {@code null} */ public static T getLast(T array[]){ return array!=null && array.length>0 ? array[array.length-1] : null; } /*-------------------------------------------------[ Contents Equality ]---------------------------------------------------*/ /** * returns array1[from1, from1+length-1] and array2[from2, from2+length-1] contain same elements * in case of index out of range, returns false */ public static boolean equals(Object array1[], int from1, Object array2[], int from2, int length){ if(from1array1.length) return false; if(from2array2.length) return false; for(int i=0; iarray1 starts with array2 */ public static boolean startsWith(Object array1[], Object array2[]){ return equals(array1, 0, array2, 0, array2.length); } /** Returns true if array1 ends with array2 */ public static boolean endsWith(Object array1[], Object array2[]){ return equals(array1, array1.length-array2.length, array2, 0, array2.length); } /*-------------------------------------------------[ Copy ]---------------------------------------------------*/ /** * Copies all elements from {@code src} array to {@code dest} array. *

* If {@code dest.length<src.length}, it copies only the number of elements * that can fit in {@code dest} array. * * @param src source array * @param dest destination array * * @return the destination array specified */ @SuppressWarnings({"SuspiciousSystemArraycopy"}) public static T[] copy(Object src[], T dest[]){ System.arraycopy(src, 0, dest, 0, Math.min(src.length, dest.length)); return dest; } /** * returns the clone of {@code src} array. * * @param src source array * @param componentType the componentType used for the new array created * * @return cloned array */ @SuppressWarnings({"unchecked"}) public static T[] clone(Object src[], Class componentType){ return copy(src, (T[])Array.newInstance(componentType, src.length)); } /** * Returns new array which contains only those elements from given {@code array} * which are selected by the {@code filter} * * @param array the array to be filtered * @param filter filter to use * * @return filtered array */ public static T[] filter(T array[], Filter filter){ List filteredList = new ArrayList(array.length); for(T element: array){ if(filter.select(element)) filteredList.add(element); } @SuppressWarnings("unchecked") T filteredArray[] = (T[])Array.newInstance(array.getClass().getComponentType(), filteredList.size()); return filteredList.toArray(filteredArray); } /*-------------------------------------------------[ Concat ]---------------------------------------------------*/ @SuppressWarnings({"unchecked"}) public static T[] concat(Object[] array1, Object array2[], Class componentType){ Object newArray[] = (Object[])Array.newInstance(componentType, array1.length+array2.length); System.arraycopy(array1, 0, newArray, 0, array1.length); System.arraycopy(array2, 0, newArray, array1.length, array2.length); return (T[])newArray; } /** * Returns new array which has all values from array1 and array2 in order. * The componentType for the new array is determined by the componentTypes of * two arrays. */ public static Object[] concat(Object array1[], Object array2[]){ Class class1 = array1.getClass().getComponentType(); Class class2 = array2.getClass().getComponentType(); Class commonClass = class1.isAssignableFrom(class2) ? class1 : (class2.isAssignableFrom(class1) ? class2 : Object.class); return concat(array1, array2, commonClass); } /*-------------------------------------------------[ toObjectArray ]---------------------------------------------------*/ public static Boolean[] toObjectArray(boolean arr[]){ if(arr==null) return null; Boolean result[] = new Boolean[arr.length]; for(int i=arr.length-1; i>=0; i--) result[i] = arr[i]; return result; } public static Character[] toObjectArray(char arr[]){ if(arr==null) return null; Character result[] = new Character[arr.length]; for(int i=arr.length-1; i>=0; i--) result[i] = arr[i]; return result; } public static Byte[] toObjectArray(byte arr[]){ if(arr==null) return null; Byte result[] = new Byte[arr.length]; for(int i=arr.length-1; i>=0; i--) result[i] = arr[i]; return result; } public static Short[] toObjectArray(short arr[]){ if(arr==null) return null; Short result[] = new Short[arr.length]; for(int i=arr.length-1; i>=0; i--) result[i] = arr[i]; return result; } public static Integer[] toObjectArray(int arr[]){ if(arr==null) return null; Integer result[] = new Integer[arr.length]; for(int i=arr.length-1; i>=0; i--) result[i] = arr[i]; return result; } public static Long[] toObjectArray(long arr[]){ if(arr==null) return null; Long result[] = new Long[arr.length]; for(int i=arr.length-1; i>=0; i--) result[i] = arr[i]; return result; } public static Float[] toObjectArray(float arr[]){ if(arr==null) return null; Float result[] = new Float[arr.length]; for(int i=arr.length-1; i>=0; i--) result[i] = arr[i]; return result; } public static Double[] toObjectArray(double arr[]){ if(arr==null) return null; Double result[] = new Double[arr.length]; for(int i=arr.length-1; i>=0; i--) result[i] = arr[i]; return result; } /*-------------------------------------------------[ ensureCapacity ]---------------------------------------------------*/ public static byte[] ensureCapacity(byte array[], int capacity){ if(capacity<=0 || capacity-array.length<=0) return array; int newCapacity = array.length*2; if(newCapacity-capacity< 0) newCapacity = capacity; if(newCapacity<0){ if(capacity<0) // overflow throw new OutOfMemoryError(); newCapacity = Integer.MAX_VALUE; } return Arrays.copyOf(array, newCapacity); } public static char[] ensureCapacity(char array[], int capacity){ if(capacity<=0 || capacity-array.length<=0) return array; int newCapacity = array.length*2; if(newCapacity-capacity< 0) newCapacity = capacity; if(newCapacity<0){ if(capacity<0) // overflow throw new OutOfMemoryError(); newCapacity = Integer.MAX_VALUE; } return Arrays.copyOf(array, newCapacity); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy