Collections Data Structure Java

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
 * indicated by the @author tags or express copyright attribution
 * statements applied by the authors.  All third-party contributions are
 * distributed under license by Red Hat Middleware LLC.
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 *
 */
import java.lang.reflect.Array;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public final class ArrayHelper {
  public static int indexOf(Object[] array, Object object) {
    for (int i = 0; i < array.length; i++) {
      if (array[i].equals(object))
        return i;
    }
    return -1;
  }
  public static String[] toStringArray(Object[] objects) {
    int length = objects.length;
    String[] result = new String[length];
    for (int i = 0; i < length; i++) {
      result[i] = objects[i].toString();
    }
    return result;
  }
  public static String[] fillArray(String value, int length) {
    String[] result = new String[length];
    Arrays.fill(result, value);
    return result;
  }
  public static int[] fillArray(int value, int length) {
    int[] result = new int[length];
    Arrays.fill(result, value);
    return result;
  }
  public static String[] toStringArray(Collection coll) {
    return (String[]) coll.toArray(EMPTY_STRING_ARRAY);
  }
  public static String[][] to2DStringArray(Collection coll) {
    return (String[][]) coll.toArray(new String[coll.size()][]);
  }
  public static int[][] to2DIntArray(Collection coll) {
    return (int[][]) coll.toArray(new int[coll.size()][]);
  }
  public static Type[] toTypeArray(Collection coll) {
    return (Type[]) coll.toArray(EMPTY_TYPE_ARRAY);
  }
  public static int[] toIntArray(Collection coll) {
    Iterator iter = coll.iterator();
    int[] arr = new int[coll.size()];
    int i = 0;
    while (iter.hasNext()) {
      arr[i++] = ((Integer) iter.next()).intValue();
    }
    return arr;
  }
  public static boolean[] toBooleanArray(Collection coll) {
    Iterator iter = coll.iterator();
    boolean[] arr = new boolean[coll.size()];
    int i = 0;
    while (iter.hasNext()) {
      arr[i++] = ((Boolean) iter.next()).booleanValue();
    }
    return arr;
  }
  public static Object[] typecast(Object[] array, Object[] to) {
    return java.util.Arrays.asList(array).toArray(to);
  }
  // Arrays.asList doesn't do primitive arrays
  public static List toList(Object array) {
    if (array instanceof Object[])
      return Arrays.asList((Object[]) array); // faster?
    int size = Array.getLength(array);
    ArrayList list = new ArrayList(size);
    for (int i = 0; i < size; i++) {
      list.add(Array.get(array, i));
    }
    return list;
  }
  public static String[] slice(String[] strings, int begin, int length) {
    String[] result = new String[length];
    for (int i = 0; i < length; i++) {
      result[i] = strings[begin + i];
    }
    return result;
  }
  public static Object[] slice(Object[] objects, int begin, int length) {
    Object[] result = new Object[length];
    for (int i = 0; i < length; i++) {
      result[i] = objects[begin + i];
    }
    return result;
  }
  public static List toList(Iterator iter) {
    List list = new ArrayList();
    while (iter.hasNext()) {
      list.add(iter.next());
    }
    return list;
  }
  public static String[] join(String[] x, String[] y) {
    String[] result = new String[x.length + y.length];
    for (int i = 0; i < x.length; i++)
      result[i] = x[i];
    for (int i = 0; i < y.length; i++)
      result[i + x.length] = y[i];
    return result;
  }
  public static String[] join(String[] x, String[] y, boolean[] use) {
    String[] result = new String[x.length + countTrue(use)];
    for (int i = 0; i < x.length; i++)
      result[i] = x[i];
    int k = x.length;
    for (int i = 0; i < y.length; i++) {
      if (use[i])
        result[k++] = y[i];
    }
    return result;
  }
  public static int[] join(int[] x, int[] y) {
    int[] result = new int[x.length + y.length];
    for (int i = 0; i < x.length; i++)
      result[i] = x[i];
    for (int i = 0; i < y.length; i++)
      result[i + x.length] = y[i];
    return result;
  }
  public static final boolean[] TRUE = { true };
  public static final boolean[] FALSE = { false };
  private ArrayHelper() {
  }
  public static String toString(Object[] array) {
    StringBuffer sb = new StringBuffer();
    sb.append("[");
    for (int i = 0; i < array.length; i++) {
      sb.append(array[i]);
      if (i < array.length - 1)
        sb.append(",");
    }
    sb.append("]");
    return sb.toString();
  }
  public static boolean isAllNegative(int[] array) {
    for (int i = 0; i < array.length; i++) {
      if (array[i] >= 0)
        return false;
    }
    return true;
  }
  public static boolean isAllTrue(boolean[] array) {
    for (int i = 0; i < array.length; i++) {
      if (!array[i])
        return false;
    }
    return true;
  }
  public static int countTrue(boolean[] array) {
    int result = 0;
    for (int i = 0; i < array.length; i++) {
      if (array[i])
        result++;
    }
    return result;
  }
  /*
   * public static int countFalse(boolean[] array) { int result=0; for ( int
   * i=0; i   */
  public static boolean isAllFalse(boolean[] array) {
    for (int i = 0; i < array.length; i++) {
      if (array[i])
        return false;
    }
    return true;
  }
  public static void addAll(Collection collection, Object[] array) {
    for (int i = 0; i < array.length; i++) {
      collection.add(array[i]);
    }
  }
  public static final String[] EMPTY_STRING_ARRAY = {};
  public static final int[] EMPTY_INT_ARRAY = {};
  public static final boolean[] EMPTY_BOOLEAN_ARRAY = {};
  public static final Class[] EMPTY_CLASS_ARRAY = {};
  public static final Object[] EMPTY_OBJECT_ARRAY = {};
  public static final Type[] EMPTY_TYPE_ARRAY = {};
  public static int[] getBatchSizes(int maxBatchSize) {
    int batchSize = maxBatchSize;
    int n = 1;
    while (batchSize > 1) {
      batchSize = getNextBatchSize(batchSize);
      n++;
    }
    int[] result = new int[n];
    batchSize = maxBatchSize;
    for (int i = 0; i < n; i++) {
      result[i] = batchSize;
      batchSize = getNextBatchSize(batchSize);
    }
    return result;
  }
  private static int getNextBatchSize(int batchSize) {
    if (batchSize <= 10) {
      return batchSize - 1; // allow 9,8,7,6,5,4,3,2,1
    } else if (batchSize / 2 < 10) {
      return 10;
    } else {
      return batchSize / 2;
    }
  }
  private static int SEED = 23;
  private static int PRIME_NUMER = 37;
  /**
   * calculate the array hash (only the first level)
   */
  public static int hash(Object[] array) {
    int length = array.length;
    int seed = SEED;
    for (int index = 0; index < length; index++) {
      seed = hash(seed, array[index] == null ? 0 : array[index].hashCode());
    }
    return seed;
  }
  /**
   * calculate the array hash (only the first level)
   */
  public static int hash(char[] array) {
    int length = array.length;
    int seed = SEED;
    for (int index = 0; index < length; index++) {
      seed = hash(seed, (int) array[index]);
    }
    return seed;
  }
  /**
   * calculate the array hash (only the first level)
   */
  public static int hash(byte[] bytes) {
    int length = bytes.length;
    int seed = SEED;
    for (int index = 0; index < length; index++) {
      seed = hash(seed, (int) bytes[index]);
    }
    return seed;
  }
  private static int hash(int seed, int i) {
    return PRIME_NUMER * seed + i;
  }
  /**
   * Compare 2 arrays only at the first level
   */
  public static boolean isEquals(Object[] o1, Object[] o2) {
    if (o1 == o2)
      return true;
    if (o1 == null || o2 == null)
      return false;
    int length = o1.length;
    if (length != o2.length)
      return false;
    for (int index = 0; index < length; index++) {
      if (!o1[index].equals(o2[index]))
        return false;
    }
    return true;
  }
  /**
   * Compare 2 arrays only at the first level
   */
  public static boolean isEquals(char[] o1, char[] o2) {
    if (o1 == o2)
      return true;
    if (o1 == null || o2 == null)
      return false;
    int length = o1.length;
    if (length != o2.length)
      return false;
    for (int index = 0; index < length; index++) {
      if (!(o1[index] == o2[index]))
        return false;
    }
    return true;
  }
  /**
   * Compare 2 arrays only at the first level
   */
  public static boolean isEquals(byte[] b1, byte[] b2) {
    if (b1 == b2)
      return true;
    if (b1 == null || b2 == null)
      return false;
    int length = b1.length;
    if (length != b2.length)
      return false;
    for (int index = 0; index < length; index++) {
      if (!(b1[index] == b2[index]))
        return false;
    }
    return true;
  }
}