⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arrayutil.java

📁 hsqldb是100%java实现的数据库,是一个开放源代码的JAVA数据库 l 具有标准的SQL语法和JAVA接口 l HSQLDB可以自由使用和分发 l 非常简洁和快速的
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* Copyright (c) 2001-2005, 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. */package org.hsqldb.lib;import java.lang.reflect.Array;/** * Collection of static methods for operations on arrays * * @author fredt@users * @version 1.7.2 * @since 1.7.2 */public class ArrayUtil {    public static final int        CLASS_CODE_BYTE    = 'B';    public static final int        CLASS_CODE_CHAR    = 'C';    public static final int        CLASS_CODE_DOUBLE  = 'D';    public static final int        CLASS_CODE_FLOAT   = 'F';    public static final int        CLASS_CODE_INT     = 'I';    public static final int        CLASS_CODE_LONG    = 'J';    public static final int        CLASS_CODE_OBJECT  = 'L';    public static final int        CLASS_CODE_SHORT   = 'S';    public static final int        CLASS_CODE_BOOLEAN = 'Z';    private static IntValueHashMap classCodeMap       = new IntValueHashMap();    static {        classCodeMap.put(byte.class, ArrayUtil.CLASS_CODE_BYTE);        classCodeMap.put(char.class, ArrayUtil.CLASS_CODE_SHORT);        classCodeMap.put(short.class, ArrayUtil.CLASS_CODE_SHORT);        classCodeMap.put(int.class, ArrayUtil.CLASS_CODE_INT);        classCodeMap.put(long.class, ArrayUtil.CLASS_CODE_LONG);        classCodeMap.put(float.class, ArrayUtil.CLASS_CODE_FLOAT);        classCodeMap.put(double.class, ArrayUtil.CLASS_CODE_DOUBLE);        classCodeMap.put(boolean.class, ArrayUtil.CLASS_CODE_BOOLEAN);        classCodeMap.put(Object.class, ArrayUtil.CLASS_CODE_OBJECT);    }    /**     * Returns a distinct int code for each primitive type and for all Object types.     */    static int getClassCode(Class cla) {        if (!cla.isPrimitive()) {            return ArrayUtil.CLASS_CODE_OBJECT;        }        return classCodeMap.get(cla, -1);    }    /**     * 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_BOOLEAN : {                boolean[] array = (boolean[]) data;                while (--to >= from) {                    array[to] = false;                }                return;            }            default : {                Object[] array = (Object[]) data;                while (--to >= from) {                    array[to] = null;                }                return;            }        }    }    /**     * Moves the contents of an array to allow both addition and removal of     * elements. Used arguments must be in range.     *     * @param type class type of the array     * @param array the array     * @param usedElements count of elements of array in use     * @param index point at which to add or remove elements     * @count number of elements to add or remove     */    public static void adjustArray(int type, Object array, int usedElements,                                   int index, int count) {        if (index >= usedElements) {            return;        }        int newCount = usedElements + count;        int source;        int target;        int size;        if (count >= 0) {            source = index;            target = index + count;            size   = usedElements - index;        } else {            source = index - count;            target = index;            size   = usedElements - index + count;        }        if (size > 0) {            System.arraycopy(array, source, array, target, size);        }        if (count < 0) {            clearArray(type, array, newCount, usedElements);        }    }    /**     * Basic sort for small arrays of int.     */    public static void sortArray(int[] array) {        boolean 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;    }    /**     *  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;    }    /**     *  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;    }    /**     * 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 boolean 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 boolean areEqual(int[] arra, int[] arrb, int count,                                   boolean 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 boolean 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 boolean 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 true if the first count elements of arra and arrb are identical     * subarrays of Objects     *     */    public static boolean haveEqualArrays(Object[] arra, Object[] arrb,                                          int count) {        if (count > arra.length || count > arrb.length) {            return false;        }        for (int j = 0; j < count; j++) {            if (arra[j] != arrb[j]) {                if (arra[j] == null ||!arra[j].equals(arrb[j])) {                    return false;                }            }        }        return true;    }    /**     * 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 boolean 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;    }    /**     * 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -