|
What this is
Other links
The source code
/* Copyright (c) 2001-2004, 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
*/
public class ArrayUtil {
final public static int CLASS_CODE_BYTE = 'B';
final public static int CLASS_CODE_CHAR = 'C';
final public static int CLASS_CODE_DOUBLE = 'D';
final public static int CLASS_CODE_FLOAT = 'F';
final public static int CLASS_CODE_INT = 'I';
final public static int CLASS_CODE_LONG = 'J';
final public static int CLASS_CODE_OBJECT = 'L';
final public static int CLASS_CODE_SHORT = 'S';
final public static 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.
|
Copyright 1998-2008 Alvin Alexander
All Rights Reserved.
devdaily.com is based in louisville, kentucky, and this web site is hosted by godaddy.com