Mega Code Archive

 
Categories / C# / Collections Data Structure
 

Collection of static methods for operations on arrays

// // (C) Copyright 2009 Irantha Suwandarathna (irantha@gmail.com) // All rights reserved. // /* Copyright (c) 2001-2008, The HSQL Development Group  * All rights reserved.  *  * Redistribution and use _in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  * Redistributions of source code must retain the above copyright notice, this  * list of conditions and the following disclaimer.  *  * Redistributions _in binary form must reproduce the above copyright notice,  * this list of conditions and the following disclaimer _in the documentation  * and/or other materials provided with the distribution.  *  * Neither the name of the HSQL Development Group nor the names of its  * contributors may be used to endorse or promote products derived from this  * software without specific prior written permission.  *  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */ using System; namespace EffiProz.Core.Lib {     /**      * Collection of static methods for operations on arrays      *      * @author fredt@users      * @version 1.7.2      * @since 1.7.2      */     public class ArrayUtil     {         public  const int CLASS_CODE_BYTE = 'B';         public  const int CLASS_CODE_CHAR = 'C';         public  const int CLASS_CODE_DOUBLE = 'D';         public  const int CLASS_CODE_FLOAT = 'F';         public  const int CLASS_CODE_INT = 'I';         public  const int CLASS_CODE_LONG = 'J';         public  const int CLASS_CODE_OBJECT = 'L';         public  const int CLASS_CODE_SHORT = 'S';         public  const int CLASS_CODE_bool = 'Z';         //private static IntValueHashMap classCodeMap = new IntValueHashMap();         //static ArrayUtil()         //{         //    classCodeMap.put(typeof(byte), ArrayUtil.CLASS_CODE_BYTE);         //    classCodeMap.put(typeof(char), ArrayUtil.CLASS_CODE_SHORT);         //    classCodeMap.put(typeof(short), ArrayUtil.CLASS_CODE_SHORT);         //    classCodeMap.put(typeof(int), ArrayUtil.CLASS_CODE_INT);         //    classCodeMap.put(typeof(long), ArrayUtil.CLASS_CODE_LONG);         //    classCodeMap.put(typeof(float), ArrayUtil.CLASS_CODE_FLOAT);         //    classCodeMap.put(typeof(double), ArrayUtil.CLASS_CODE_DOUBLE);         //    classCodeMap.put(typeof(bool), ArrayUtil.CLASS_CODE_bool);         //    classCodeMap.put(typeof(Object), ArrayUtil.CLASS_CODE_OBJECT);         //}         ///**         // * Returns a distinct int code for each primitive type and for all Object types.         // */         //static int getClassCode(Type cla)         //{         //    if (!cla.IsPrimitive)         //    {         //        return ArrayUtil.CLASS_CODE_OBJECT;         //    }         //    return classCodeMap.get(cla, -1);         //}         /**      * Returns true if arra and the first bcount elements of arrb share any      * element. <p>      *      * Used for checks for any overlap between two arrays of column indexes.      */        public static bool haveCommonElement(int[] arra, int[] arrb,                 int bcount)         {             for (int i = 0; i < arra.Length; i++)             {                 int c = arra[i];                 for (int j = 0; j < bcount; j++)                 {                     if (c == arrb[j])                     {                         return true;                     }                 }             }             return false;         }         public static bool areIntIndexesInBooleanArray(int[] arra,             bool[] arrb)         {             for (int i = 0; i < arra.Length; i++)             {                 if (arrb[arra[i]])                 {                     continue;                 }                 return false;             }             return true;         }         /**    * Return count of true elements in array    */         /**     *  As above but copies in reverse direction. <p>     *     *  @param row the target array     *  @param columnMap the list of indexes into row     *  @param newRow the source array     */         public static void projectRowReverse(Object[] row, int[] columnMap,                                              Object[] newRow)         {             for (int i = 0; i < columnMap.Length; i++)             {                 row[columnMap[i]] = newRow[i];             }         }         public static void orBooleanArray(bool[] source, bool[] dest)         {             for (int i = 0; i < dest.Length; i++)             {                 dest[i] |= source[i];             }         }      /**      * Returns a duplicates of an array.      */     public static Object duplicateArray(Object source) {         int size = ((Array)source).Length;         Array newarray =             Array.CreateInstance(source.GetType().GetElementType(), size);         Array.Copy((Array)source, 0, newarray, 0, size);         return newarray;     }         public static int countTrueElements(bool[] arra)         {             int count = 0;             for (int i = 0; i < arra.Length; i++)             {                 if (arra[i])                 {                     count++;                 }             }             return count;         }         public static int find(short[] array, int value)         {             for (int i = 0; i < array.Length; i++)             {                 if (array[i] == value)                 {                     return i;                 }             }             return -1;         }         public static int find(short[] array, int value, int offset, int count)         {             for (int i = offset; i < offset + count; i++)             {                 if (array[i] == value)                 {                     return i;                 }             }             return -1;         }         /**          *  Finds the first element of the array that is not equal to the given value.          */         public static int findNot(int[] array, int value)         {             for (int i = 0; i < array.Length; i++)             {                 if (array[i] != value)                 {                     return i;                 }             }             return -1;         }         /**      * Determines if the array has a null column for any of the positions given      * in the rowColMap array.      */         public static bool hasNull(Object[] array, int[] columnMap)         {             int count = columnMap.Length;             for (int i = 0; i < count; i++)             {                 if (array[columnMap[i]] == null)                 {                     return true;                 }             }             return false;         }         public static bool hasAllNull(Object[] array, int[] columnMap)         {             int count = columnMap.Length;             for (int i = 0; i < count; i++)             {                 if (array[columnMap[i]] != null)                 {                     return false;                 }             }             return true;         }         /**          * Clears an area of the given array of the given type.          */         public static void clearArray(int type, Object data, int from, int to)         {             switch (type)             {                 case ArrayUtil.CLASS_CODE_BYTE:                     {                         byte[] array = (byte[])data;                         while (--to >= from)                         {                             array[to] = 0;                         }                         return;                     }                 case ArrayUtil.CLASS_CODE_CHAR:                     {                         byte[] array = (byte[])data;                         while (--to >= from)                         {                             array[to] = 0;                         }                         return;                     }                 case ArrayUtil.CLASS_CODE_SHORT:                     {                         short[] array = (short[])data;                         while (--to >= from)                         {                             array[to] = 0;                         }                         return;                     }                 case ArrayUtil.CLASS_CODE_INT:                     {                         int[] array = (int[])data;                         while (--to >= from)                         {                             array[to] = 0;                         }                         return;                     }                 case ArrayUtil.CLASS_CODE_LONG:                     {                         long[] array = (long[])data;                         while (--to >= from)                         {                             array[to] = 0;                         }                         return;                     }                 case ArrayUtil.CLASS_CODE_FLOAT:                     {                         float[] array = (float[])data;                         while (--to >= from)                         {                             array[to] = 0;                         }                         return;                     }                 case ArrayUtil.CLASS_CODE_DOUBLE:                     {                         double[] array = (double[])data;                         while (--to >= from)                         {                             array[to] = 0;                         }                         return;                     }                 case ArrayUtil.CLASS_CODE_bool:                     {                         bool[] array = (bool[])data;                         while (--to >= from)                         {                             array[to] = false;                         }                         return;                     }                 default:                     {                         Object[] array = (Object[])data;                         while (--to >= from)                         {                             array[to] = null;                         }                         return;                     }             }         }         /**          * Basic sort for small arrays of int.          */         public static void sortArray(int[] array)         {             bool swapped;             do             {                 swapped = false;                 for (int i = 0; i < array.Length - 1; i++)                 {                     if (array[i] > array[i + 1])                     {                         int temp = array[i + 1];                         array[i + 1] = array[i];                         array[i] = temp;                         swapped = true;                     }                 }             } while (swapped);         }         /**          *  Basic find for small arrays of Object.          */         public static int find(Object[] array, Object _object)         {             for (int i = 0; i < array.Length; i++)             {                 if (array[i] == _object)                 {                     // hadles both nulls                     return i;                 }                 if (_object != null && _object.Equals(array[i]))                 {                     return i;                 }             }             return -1;         }         /**     * Returns the index of the first occurence of arrb in arra. Or -1 if not found.     */         public static int find(byte[] arra, int start, int limit, byte[] arrb)         {             int k = start;             limit = limit - arrb.Length + 1;             int value = arrb[0];             for (; k < limit; k++)             {                 if (arra[k] == value)                 {                     if (arrb.Length == 1)                     {                         return k;                     }                     if (containsAt(arra, k, arrb))                     {                         return k;                     }                 }             }             return -1;         }         /**          *  Basic find for small arrays of int.          */         public static int find(int[] array, int value)         {             for (int i = 0; i < array.Length; i++)             {                 if (array[i] == value)                 {                     return i;                 }             }             return -1;         }         /**          * Returns true if arra and arrb contain the same set of integers, not          * necessarily _in the same order. This implies the arrays are of the same          * length.          */         public static bool areEqualSets(int[] arra, int[] arrb)         {             return arra.Length == arrb.Length                    && ArrayUtil.haveEqualSets(arra, arrb, arra.Length);         }         /**          * For full == true returns true if arra and arrb are identical (have the          * same length and contain the same integers _in the same sequence).          *          * For full == false returns the result          * of haveEqualArrays(arra,arrb,count)          *          * For full == true, the array lengths must be the same as count          *          */         public static bool areEqual(int[] arra, int[] arrb, int count,                                        bool full)         {             if (ArrayUtil.haveEqualArrays(arra, arrb, count))             {                 if (full)                 {                     return arra.Length == arrb.Length && count == arra.Length;                 }                 return true;             }             return false;         }         /**          * Returns true if the first count elements of arra and arrb are identical          * sets of integers (not necessarily _in the same order).          *          */         public static bool haveEqualSets(int[] arra, int[] arrb, int count)         {             if (count > arra.Length || count > arrb.Length)             {                 return false;             }             if (count == 1)             {                 return arra[0] == arrb[0];             }             int[] tempa = (int[])resizeArray(arra, count);             int[] tempb = (int[])resizeArray(arrb, count);             sortArray(tempa);             sortArray(tempb);             for (int j = 0; j < count; j++)             {                 if (tempa[j] != tempb[j])                 {                     return false;                 }             }             return true;         }         /**          * Returns true if the first count elements of arra and arrb are identical          * subarrays of integers          *          */         public static bool haveEqualArrays(int[] arra, int[] arrb, int count)         {             if (count > arra.Length || count > arrb.Length)             {                 return false;             }             for (int j = 0; j < count; j++)             {                 if (arra[j] != arrb[j])                 {                     return false;                 }             }             return true;         }         /**          * Returns an int[] containing elements shared between the two arrays          * arra and arrb. The arrays contain sets (no value is repeated).          *          * Used to find the overlap between two arrays of column indexes.          * Ordering of the result arrays will be the same as _in array          * a. The method assumes that each index is only listed          * once _in the two input arrays.          * <p>          * e.g.          * </p>          * <code>          * <table width="90%" bgcolor="lightblue">          * <tr><td colspane="3">The arrays</td></tr>          * <tr><td>int []arra</td><td>=</td><td>{2,11,5,8}</td></tr>          * <tr><td>int []arrb</td><td>=</td><td>{20,8,10,11,28,12}</td></tr>          * <tr><td colspane="3">will result in:</td></tr>          * <tr><td>int []arrc</td><td>=</td><td>{11,8}</td></tr>          * </table>          *          * @param arra int[]; first column indexes          *          * @param arrb int[]; second column indexes          *          * @return int[] common indexes or <code>null</code> if there is no overlap.          *          * @short Return the overlap between two arrays of column indexes.          */         public static int[] commonElements(int[] arra, int[] arrb)         {             int[] c = null;             int n = countCommonElements(arra, arrb);             if (n > 0)             {                 c = new int[n];                 int k = 0;                 for (int i = 0; i < arra.Length; i++)                 {                     for (int j = 0; j < arrb.Length; j++)                     {                         if (arra[i] == arrb[j])                         {                             c[k++] = arra[i];                         }                     }                 }             }             return c;         }         /**          * Returns the number of elements shared between the two arrays containing          * sets.<p>          *          * Return the number of elements shared by two column index arrays.          * This method assumes that each of these arrays contains a set (each          * element index is listed only once _in each index array). Otherwise the          * returned number will NOT represent the number of unique column indexes          * shared by both index array.          *          * @param arra int[]; first array of column indexes.          *          * @param arrb int[]; second array of column indexes          *          * @return int; number of elements shared by <code>a</code> and <code>b</code>          */         public static int countCommonElements(int[] arra, int[] arrb)         {             int k = 0;             for (int i = 0; i < arra.Length; i++)             {                 for (int j = 0; j < arrb.Length; j++)                 {                     if (arra[i] == arrb[j])                     {                         k++;                     }                 }             }             return k;         }         /**          * Returns the count of elements _in arra from position start that are          * sequentially equal to the elements of arrb.          */         public static int countSameElements(byte[] arra, int start, byte[] arrb)         {             int k = 0;             int limit = arra.Length - start;             if (limit > arrb.Length)             {                 limit = arrb.Length;             }             for (int i = 0; i < limit; i++)             {                 if (arra[i + start] == arrb[i])                 {                     k++;                 }                 else                 {                     break;                 }             }             return k;         }        /**         * Returns the count of elements in arra from position start that are         * among the elements of arrb. Stops at any element not in arrb.         */         public static int countStartElementsAt(byte[] arra, int start,                                                byte[] arrb)         {             int k = 0;             for (int i = start; i < arra.Length; i++)             {                 for (int j = 0; j < arrb.Length; j++)                 {                     if (arra[i] == arrb[j])                     {                         k++;                         goto mainloop;                     }                 }                 break;             mainloop:                 continue;             }             return k;         }    /**     * Returns the count of elements in arra from position start that are not     * among the elements of arrb.     *     */         public static int countNonStartElementsAt(byte[] arra, int start,                 byte[] arrb)         {             int k = 0;             for (int i = start; i < arra.Length; i++)             {                 for (int j = 0; j < arrb.Length; j++)                 {                     if (arra[i] == arrb[j])                     {                         goto outmainloop;                     }                 }                 k++;             }         outmainloop:             return k;         }         ///**         // * Returns the index of the first occurence of arrb _in arra. Or -1 if not found.         // */         //public static int find(byte[] arra, int start, int limit, byte[] arrb)         //{         //    int k = 0;         //    limit = limit - arrb.Length + 1;         //    int value = arrb[0];         //    for (; k < limit; k++)         //    {         //        if (arra[k] == value)         //        {         //            if (arrb.Length == 1)         //            {         //                return k;         //            }         //            if (containsAt(arra, k, arrb))         //            {         //                return k;         //            }         //        }         //    }         //    return -1;         //}         ///**         // * Returns an index into arra (or -1) where the character is not _in the         // * charset byte array.         // */         //public static int findNotIn(byte[] arra, int start, int limit,         //                            byte[] charset)         //{         //    int k = 0;         //    for (; k < limit; k++)         //    {         //        for (int i = 0; i < charset.Length; i++)         //        {         //            if (arra[k] == charset[i])         //            {         //                continue;         //            }         //        }         //        return k;         //    }         //    return -1;         //}         ///**         // * Returns an index into arra (or -1) where the character is _in the         // * charset byte array.         // */         //public static int findIn(byte[] arra, int start, int limit,         //                         byte[] charset)         //{         //    int k = 0;         //    for (; k < limit; k++)         //    {         //        for (int i = 0; i < charset.Length; i++)         //        {         //            if (arra[k] == charset[i])         //            {         //                return k;         //            }         //        }         //    }         //    return -1;         //}         ///**         // * Returns the index of b or c _in arra. Or -1 if not found.         // */         //public static int find(byte[] arra, int start, int limit, int b, int c)         //{         //    int k = 0;         //    for (; k < limit; k++)         //    {         //        if (arra[k] == b || arra[k] == c)         //        {         //            return k;         //        }         //    }         //    return -1;         //}         /**          * Set elements of arrb true if their indexes appear _in arrb.          */         public static void intIndexesToboolArray(int[] arra, bool[] arrb)         {             for (int i = 0; i < arra.Length; i++)             {                 if (arra[i] < arrb.Length)                 {                     arrb[arra[i]] = true;                 }             }         }         /**          * Return true if for each true element _in arrb, the corresponding          * element _in arra is true          */         public static bool containsAllTrueElements(bool[] arra,                 bool[] arrb)         {             for (int i = 0; i < arra.Length; i++)             {                 if (arrb[i] && !arra[i])                 {                     return false;                 }             }             return true;         }         /**          * Returns true if arra from position start contains all elements of arrb          * _in sequential order.          */         public static bool containsAt(byte[] arra, int start, byte[] arrb)         {             return countSameElements(arra, start, arrb) == arrb.Length;         }         ///**         // * Returns the count of elements _in arra from position start that are         // * among the elements of arrb. Stops at any element not _in arrb.         // */         //public static int countStartElementsAt(byte[] arra, int start,         //                                       byte[] arrb)         //{         //    int k = 0;         //    for (int i = start; i < arra.Length; i++)         //    {         //        for (int j = 0; j < arrb.Length; j++)         //        {         //            if (arra[i] == arrb[j])         //            {         //                k++;         //                goto mainloop;         //            }         //        }         //        break;         //    mainloop: { }         //    }         //    return k;         //}         ///**         // * Returns the count of elements _in arra from position start that are not         // * among the elements of arrb.         // *         // */         //public static int countNonStartElementsAt(byte[] arra, int start,         //        byte[] arrb)         //{         //    int k = 0;         //    for (int i = start; i < arra.Length; i++)         //    {         //        for (int j = 0; j < arrb.Length; j++)         //        {         //            if (arra[i] == arrb[j])         //            {         //                goto mainloop;         //            }         //        }         //        k++;         //    }         //mainloop: { }         //    return k;         //}         ///**         // * Convenience wrapper for Array.Copy().         // */         //public static void copyArray(Object source, Object dest, int count)         //{         //    Array.Copy((Array)source, 0, (Array)dest, 0, count);         //}         /**          * Returns a range of elements of source from start to end of the array.          */         public static int[] arraySlice(int[] source, int start, int count)         {             int[] slice = new int[count];             Array.Copy(source, start, slice, 0, count);             return slice;         }         /**          * Fills the array with a value.          */         public static void fillArray(Object[] array, Object value)         {             int to = array.Length;             while (--to >= 0)             {                 array[to] = value;             }         }         /**    * Fills part of the array with a value.    */         public static void fillArray(char[] array, int offset, char value)         {             int to = array.Length;             while (--to >= offset)             {                 array[to] = value;             }         }         /**          * Fills the int array with a value          */         public static void fillArray(int[] array, int value)         {             int to = array.Length;             while (--to >= 0)             {                 array[to] = value;             }         }         ///**         // * Returns a duplicates of an array.         // */         //public static Object duplicateArray(Object source)         //{         //    int size = ((Array)source).Length;         //    Object newarray =         //        Array.CreateInstance(source.GetType(), size);         //    Array.Copy((Array)source, 0, (Array)newarray, 0, size);         //    return newarray;         //}         /**          * Returns the given array if newsize is the same as existing.          * Returns a new array of given size, containing as many elements of          * the original array as it can hold.          */         public static Object resizeArrayIfDifferent(Object source, int newsize)         {             int oldsize = ((Array)source).Length;             if (oldsize == newsize)             {                 return source;             }             Object newarray =                 Array.CreateInstance(source.GetType().GetElementType(), newsize);             if (oldsize < newsize)             {                 newsize = oldsize;             }             Array.Copy((Array)source, 0, (Array)newarray, 0, newsize);             return newarray;         }         /**          * Returns a new array of given size, containing as many elements of          * the original array as it can hold. N.B. Always returns a new array          * even if newsize parameter is the same as the old size.          */         public static Object resizeArray(Object source, int newsize)         {             Object newarray =                 Array.CreateInstance(source.GetType().GetElementType(), newsize);             int oldsize = ((Array)source).Length;             if (oldsize < newsize)             {                 newsize = oldsize;             }             Array.Copy((Array)source, 0, (Array)newarray, 0, newsize);             return newarray;         }         /**          * Returns an array containing the elements of parameter source, with one          * element removed or added. Parameter adjust {-1, +1} indicates the          * operation. Parameter colindex indicates the position at which an element          * is removed or added. Parameter addition is an Object to add when          * adjust is +1.          */         public static Object toAdjustedArray(Array source, Object addition,                                              int colindex, int adjust)         {             int newsize = ((Array)source).Length + adjust;             Object newarray =                 Array.CreateInstance(source.GetType().GetElementType(), newsize);             copyAdjustArray(source, newarray, addition, colindex, adjust);             return newarray;         }         /**          *  Copies elements of source to dest. If adjust is -1 the element at          *  colindex is not copied. If adjust is +1 that element is filled with          *  the Object addition. All the rest of the elements _in source are          *  shifted left or right accordingly when they are copied. If adjust is 0          *  the addition is copied over the element at colindex.          *          *  No checks are perfomed on array sizes and an exception is thrown          *  if they are not consistent with the other arguments.          */         public static void copyAdjustArray(Object source, Object dest,                                            Object addition, int colindex,                                            int adjust)         {             int length = ((Array)source).Length;             if (colindex < 0)             {                 Array.Copy((Array)source, 0, (Array)dest, 0, length);                 return;             }             Array.Copy((Array)source, 0, (Array)dest, 0, colindex);             if (adjust == 0)             {                 int endcount = length - colindex - 1;                 ((Array)dest).SetValue(addition, colindex);                 if (endcount > 0)                 {                     Array.Copy((Array)source, colindex + 1, (Array)dest, colindex + 1,                                      endcount);                 }             }             else if (adjust < 0)             {                 int endcount = length - colindex - 1;                 if (endcount > 0)                 {                     Array.Copy((Array)source, colindex + 1, (Array)dest, colindex,                                      endcount);                 }             }             else             {                 int endcount = length - colindex;                 ((Array)dest).SetValue(addition, colindex);                 if (endcount > 0)                 {                     Array.Copy((Array)source, colindex, (Array)dest, colindex + 1,                                      endcount);                 }             }         }         /**          * Returns a new array with the elements _in collar adjusted to reflect          * changes at colindex. <p>          *          * Each element _in collarr represents an index into another array          * otherarr. <p>          *          * colindex is the index at which an element is added or removed.          * Each element _in the result array represents the new,          * adjusted index. <p>          *          * For each element of collarr that represents an index equal to          * colindex and adjust is -1, the result will not contain that element          * and will be shorter than collar by one element.          *          * @param  colarr the source array          * @param  colindex index at which to perform adjustement          * @param  adjust +1, 0 or -1          * @return new, adjusted array          */         public static int[] toAdjustedColumnArray(int[] colarr, int colindex,                 int adjust)         {             if (colarr == null)             {                 return null;             }             int[] intarr = new int[colarr.Length];             int j = 0;             for (int i = 0; i < colarr.Length; i++)             {                 if (colarr[i] > colindex)                 {                     intarr[j] = colarr[i] + adjust;                     j++;                 }                 else if (colarr[i] == colindex)                 {                     if (adjust < 0)                     {                         // skip an element from colarr                     }                     else                     {                         intarr[j] = colarr[i] + adjust;                         j++;                     }                 }                 else                 {                     intarr[j] = colarr[i];                     j++;                 }             }             if (colarr.Length != j)             {                 int[] newarr = new int[j];                 Array.Copy(intarr, newarr, j);                 return newarr;             }             return intarr;         }         /**          *  Copies some elements of row into colobject by using colindex as          *  the list of indexes into row. <p>          *          *  colindex and colobject are of equal length and are normally          *  shorter than row. <p>          *          *  @param row the source array          *  @param colindex the list of indexes into row          *  @param colobject the destination array          */         public static void copyColumnValues(Object[] row, int[] colindex,                                             Object[] colobject)         {             for (int i = 0; i < colindex.Length; i++)             {                 colobject[i] = row[colindex[i]];             }         }         public static void copyColumnValues(int[] row, int[] colindex,                                             int[] colobject)         {             for (int i = 0; i < colindex.Length; i++)             {                 colobject[i] = row[colindex[i]];             }         }         public static void fillSequence(int[] colindex)         {             for (int i = 0; i < colindex.Length; i++)             {                 colindex[i] = i;             }         }         /**      *  Copies some elements of row into newRow by using columnMap as      *  the list of indexes into row. <p>      *      *  columnMap and newRow are of equal length and are normally      *  shorter than row. <p>      *      *  @param row the source array      *  @param columnMap the list of indexes into row      *  @param newRow the destination array      */         public static void projectRow(Object[] row, int[] columnMap,                                       Object[] newRow)         {             for (int i = 0; i < columnMap.Length; i++)             {                 newRow[i] = row[columnMap[i]];             }         }         public static void projectRow(int[] row, int[] columnMap, int[] newRow)         {             for (int i = 0; i < columnMap.Length; i++)             {                 newRow[i] = row[columnMap[i]];             }         }         /*             public static void main(String[] args) {                 int[] a = new int[] {                     23, 11, 37, 7, 1, 5                 };                 int[] b = new int[] {                     1, 3, 7, 11, 13, 17, 19, 3, 1                 };                 int[] c = toAdjustedColumnArray(a, 7, -1);                 int[] d = toAdjustedColumnArray(b, 11, 1);                 int[] e = new int[a.Length];                 copyArray(a, e, a.Length);                 sortArray(e);                 int[] f = new int[b.Length];                 copyArray(b, f, b.Length);                 sortArray(f);                 bool x = haveEqualSets(a, e, a.Length);                 bool y = haveEqualSets(b, f, b.Length);                  Console.Write("test passed: ");                  Console.Write(x == true && y == true && c.Length == a.Length - 1                                  && d.Length == b.Length);             }         */     } }