Collections Data Structure Java

/**
 * The utillib library.
 * More information is available at http://www.jinchess.com/.
 * Copyright (C) 2002, 2003 Alexander Maryanovsky.
 * All rights reserved.
 *
 * The utillib library is free software; you can redistribute
 * it and/or modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * The utillib library 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 utillib library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
 */
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.NoSuchElementException;
/**
 * A collection of general utility methods.
 */
public class Utilities{
  
  
  
  /**
   * A 0-length Object array.
   */
   
  public static final Object [] EMPTY_ARRAY = new Object[0];
  /**
   * A 0-length long array.
   */
   
  public static final long [] EMPTY_LONG_ARRAY = new long[0];
  /**
   * A 0-length int array.
   */
   
  public static final int [] EMPTY_INT_ARRAY = new int[0];
  
  
  /**
   * A 0-length short array.
   */
   
  public static final short [] EMPTY_SHORT_ARRAY = new short[0];
  
  /**
   * A 0-length byte array.
   */
   
  public static final byte [] EMPTY_BYTE_ARRAY = new byte[0];
  
  
  
  /**
   * A 0-length char array.
   */
   
  public static final char [] EMPTY_CHAR_ARRAY = new char[0];
  /**
   * A 0-length double array.
   */
   
  public static final double [] EMPTY_DOUBLE_ARRAY = new double[0];
  
  /**
   * A 0-length float array.
   */
   
  public static final float [] EMPTY_FLOAT_ARRAY = new float[0];
  /**
   * A 0-length String array.
   */
   
  public static final String [] EMPTY_STRING_ARRAY = new String[0];
  
  
  
  /**
   * An empty enumeration.
   */
  
  public static final Enumeration EMPTY_ENUM = new Enumeration(){
    public boolean hasMoreElements(){return false;}
    public Object nextElement(){throw new NoSuchElementException();}
  };
  
  
  /**
   * Returns true if the two specified objects are the same.
   * Returns false otherwise. To be considered the same, the two
   * references must either both be null or invoking equals on one
   * of them with the other must return true.
   */
  public static boolean areEqual(Object obj1, Object obj2){
    return (obj1 == obj2) || (obj1 == null ? false : obj1.equals(obj2));
  }
  /**
   * Maps the specified key to the specified value in the specified
   * Hashtable. If the specified value is null any
   * existing mapping of the specified key is removed from the
   * Hashtable. The old value mapped to the specified key
   * is returned, or null if no value was mapped to the key.
   */
  public static Object put(Hashtable table, Object key, Object value){
    return value == null ? table.remove(key) : table.put(key, value);
  }
  /**
   * Returns true if the specified object is an element of the
   * specified array. The specified array may not be null. The
   * specified object may be null, in which case this method will
   * return true iff one of the indices in the array is empty 
   * (contains null).
   */
  public static boolean contains(Object [] array, Object item){
    return (indexOf(array, item) != -1);
  }
  /**
   * Returns the index of the first occurrance of specified object in the
   * specified array, or -1 if the specified object is not an element of the
   * specified array. The specified object may be null in which
   * case the returned index will be the index of the first null
   * in the array.
   */
  public static int indexOf(Object [] array, Object item){
    if (array == null)
      throw new IllegalArgumentException("The specified array may not be null");
    for (int i = 0; i < array.length; i++)
      if (areEqual(item, array[i]))
        return i;
    return -1;
  }
  /**
   * Returns the index of the first occurrance of specified integer in the
   * specified array, or -1 if the specified integer is not an element of the
   * specified array.
   */
  public static int indexOf(int [] arr, int val){
    if (arr == null)
      throw new IllegalArgumentException("The specified array may not be null");
    for (int i = 0; i < arr.length; i++)
      if (arr[i] == val)
        return i;
    return -1;
  }
  
  
  /**
   * Converts the specified array into a string by appending all its elements
   * separated by a semicolon.
   */
  public static String arrayToString(Object [] arr){
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < arr.length; i++){
      buf.append(arr[i]);
      buf.append("; ");
    }
    if (arr.length > 0)
      buf.setLength(buf.length() - 2); // get rid of the extra "; "
    return buf.toString();
  }
  /**
   * Converts the specified Hashtable into a string by putting
   * each key and value on a separate line (separated by '\n') and an arrow
   * (" -> ") between them.
   */
  public static String hashtableToString(Hashtable hashtable){
    StringBuffer buf = new StringBuffer();
    Enumeration keys = hashtable.keys();
    while (keys.hasMoreElements()){
      Object key = keys.nextElement();
      Object value = hashtable.get(key);
      buf.append(key.toString());
      buf.append(" -> ");
      buf.append(value.toString());
      buf.append("\n");
    }
    return buf.toString();
  }
  /**
   * Returns the maximum element in the specified integer array.
   */
  public static int max(int [] arr){
    if (arr == null)
      throw new IllegalArgumentException("The specified array may not be null");
    if (arr.length == 0)
      throw new IllegalArgumentException("The specified array must have at least one element");
    int n = arr[0];
    for (int i = 1; i < arr.length; i++)
      if (arr[i] > n)
        n = arr[i];
    return n;
  }
  /**
   * Returns a hash code for the specified double value.
   */
  public static int hashCode(double val){
    return hashCode(Double.doubleToLongBits(val));
  }
  /**
   * Returns a hash code for the specified long value.
   */
  public static int hashCode(long val){
    return (int)(val ^ (val >>> 32));
  }
  
  
  
  /**
   * Returns the name of the package of the specified class.
   */
  
  public static String getPackageName(Class c){
    return getPackageName(c.getName());
  }
  
  
  
  /**
   * Returns the name of the package of the class with the specified (full) name.
   */
  
  public static String getPackageName(String className){
    int lastDotIndex = className.lastIndexOf(".");
    return lastDotIndex == -1 ? "" : className.substring(0, lastDotIndex);
  }
  
  
  
  /**
   * Returns the short name (excluding the package name) of the specified class. 
   */
  
  public static String getClassName(Class c){
    return getClassName(c.getName());
  }
  
  
  
  /**
   * Returns the short name (excluding the package name) of the class with the
   * specified fully qualified name.
   */
  
  public static String getClassName(String className){
    int lastDotIndex = className.lastIndexOf(".");
    return lastDotIndex == -1 ? className : className.substring(lastDotIndex + 1);
  }
  
  
  
}