Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Concatenate Java arrays

/*  * 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);   } }