/* 
 * Convenience methods for working with Java arrays. 
 * Copyright (C) 2005 Stephen Ostermiller 
 * http://ostermiller.org/contact.pl?regarding=Java+Utilities 
 * 
 * This program is free software; you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation; either version 2 of the License, or 
 * (at your option) any later version. 
 * 
 * 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 General Public License for more details. 
 * 
 * See COPYING.TXT for details. 
 */ 
 
import java.io.IOException; 
import java.lang.reflect.Array; 
 
/** 
 * Convenience methods for working with Java arrays. 
 * More information about this class is available from <a target="_top" href= 
 * "http://ostermiller.org/utils/ArrayHelper.html">ostermiller.org</a>. 
 * 
 * @author Stephen Ostermiller http://ostermiller.org/contact.pl?regarding=Java+Utilities 
 * @since ostermillerutils 1.06.00 
 */ 
public final class ArrayHelper { 
 
  /** 
   * Concatenates the given arrays into a single long array. 
   * The returned array will be of the common super type of the 
   * two given arrays. 
   * <p> 
   * For example it can be called like this:<br> 
   * <pre> 
   * String[] arr = (String[])ArrayHelper.cat(new String[]{"one","two"}, new String[]{"three","four"}); 
   * </pre> 
   * 
   * @param arr1 first array 
   * @param arr2 second array 
   * @return an array whose length is the sum of the given array's lengths and contains all the elements in the given arrays. 
   * @since ostermillerutils 1.06.00 
   */ 
  public static Object[] cat(Object[] arr1, Object[] arr2){ 
    // Use reflection to find the super class of both arrays 
    Class<?> commonSuperClass = Object.class; 
    boolean foundcommonSuperClass=false; 
    for (Class<?> c1 = arr1.getClass().getComponentType(); !foundcommonSuperClass && !c1.equals(Object.class); c1 = c1.getSuperclass()){ 
      for (Class<?> c2 = arr2.getClass().getComponentType(); !foundcommonSuperClass && !c2.equals(Object.class); c2 = c2.getSuperclass()){ 
        if (c2.equals(c1)){ 
          foundcommonSuperClass = true; 
          commonSuperClass = c1; 
        } 
      } 
    } 
    // Create a new array of the correct type 
    Object[] result = (Object[])Array.newInstance(commonSuperClass, arr1.length + arr2.length); 
    // Copy the two arrays into the large array 
    System.arraycopy(arr1, 0, result, 0, arr1.length); 
    System.arraycopy(arr2, 0, result, arr1.length, arr2.length); 
    return result; 
  } 
 
 
 
  /** 
   * Tests two arrays to see if the arrays are equal. 
   * Two arrays will be equal only if they are the same length 
   * and contain objects that are equal in the same order. 
   * 
   * @param arr1 first array 
   * @param arr2 second array 
   * @return true iff two arguments are equal 
   * @since ostermillerutils 1.06.00 
   */ 
  public static boolean equal(Object[] arr1, Object[] arr2){ 
    if (arr1 == null && arr2 == null) return true; 
    if (arr1 == null || arr2 == null) return false; 
    if (arr1.length != arr2.length) return false; 
    for (int i=0; i<arr1.length; i++){ 
      if (!equalObjects(arr1[i], arr2[i])) return false; 
    } 
    return true; 
  } 
 
  /** 
   * Tests if the two objects are equal 
   * 
   * @param o1 first object 
   * @param o2 second object 
   * @since ostermillerutils 1.06.00 
   */ 
  private static boolean equalObjects(Object o1, Object o2){ 
    if (o1 == null && o2 == null) return true; 
    if (o1 == null || o2 == null) return false; 
    return o1.equals(o2); 
  } 
} 
 
    
     
     
     
     
     
  
  |