package org.basex.util;
import java.util.Arrays;
import org.basex.util.list.IntList;
/**
* This class provides convenience methods for handling arrays
* and serves as an extension to the {@link Arrays} class of Java.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class Array {
/** Default factor for resizing dynamic arrays. */
public static final double RESIZE = 1.5;
/** Private constructor. */
private Array() { }
/**
* Copies the specified array.
* @param a array to be copied
* @param s new array size
* @return new array
*/
public static byte[][] copyOf(final byte[][] a, final int s) {
final byte[][] tmp = new byte[s][];
System.arraycopy(a, 0, tmp, 0, Math.min(s, a.length));
return tmp;
}
/**
* Copies the specified array.
* @param a array to be copied
* @param s new array size
* @return new array
*/
public static int[][] copyOf(final int[][] a, final int s) {
final int[][] tmp = new int[s][];
System.arraycopy(a, 0, tmp, 0, Math.min(s, a.length));
return tmp;
}
/**
* Copies the specified array.
* @param a array to be copied
* @param s new array size
* @return new array
*/
public static String[] copyOf(final String[] a, final int s) {
final String[] tmp = new String[s];
System.arraycopy(a, 0, tmp, 0, Math.min(s, a.length));
return tmp;
}
/**
* Adds an entry to the end of an array and returns the new array.
* @param ar array to be resized
* @param e entry to be added
* @param <T> array type
* @return array
*/
public static <T> T[] add(final T[] ar, final T e) {
final int s = ar.length;
final T[] t = Arrays.copyOf(ar, s + 1);
t[s] = e;
return t;
}
/**
* Adds an entry to the end of an array and returns the new array.
* @param ar array to be resized
* @param e entry to be added
* @return array
*/
public static int[] add(final int[] ar, final int e) {
final int s = ar.length;
final int[] t = Arrays.copyOf(ar, s + 1);
t[s] = e;
return t;
}
/**
* Moves entries inside an array.
* @param ar array
* @param pos position
* @param off move offset
* @param l length
*/
public static void move(final Object ar, final int pos, final int off,
final int l) {
System.arraycopy(ar, pos, ar, pos + off, l);
}
/**
* Removes an array entry at the specified position.
* @param ar array to be resized
* @param p position
* @param <T> array type
* @return array
*/
public static <T> T[] delete(final T[] ar, final int p) {
final int s = ar.length - 1;
move(ar, p + 1, -1, s - p);
return Arrays.copyOf(ar, s);
}
/**
* Sorts the specified tokens and returns an integer array
* with offsets to of the sorted tokens.
* @param tok token array to sort by
* @param num numeric sort
* @param asc ascending
* @return sorted integer array
*/
public static int[] createOrder(final byte[][] tok, final boolean num,
final boolean asc) {
final IntList il = number(tok.length);
il.sort(tok, num, asc);
return il.toArray();
}
/**
* Sorts the specified numeric tokens and returns an integer array
* with offsets to of the sorted tokens.
* @param tok token array to sort by
* @param asc ascending
* @return sorted integer array
*/
public static int[] createOrder(final double[] tok, final boolean asc) {
final IntList il = number(tok.length);
il.sort(tok, asc);
return il.toArray();
}
/**
* Returns an integer list with a number list.
* @param l array size
* @return number list
*/
private static IntList number(final int l) {
final int[] tmp = new int[l];
for(int i = 0; i < l; ++i) tmp[i] = i;
return new IntList(tmp);
}
/**
* Reverses the order of the elements in the given array.
* @param arr array
*/
public static void reverse(final byte[] arr) {
reverse(arr, 0, arr.length);
}
/**
* Reverses the order of all elements in the given interval.
* @param arr array
* @param pos position of first element of the interval
* @param len length of the interval
*/
private static void reverse(final byte[] arr, final int pos, final int len) {
for(int l = pos, r = pos + len - 1; l < r; l++, r--) {
final byte tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
}
}
/**
* Reverses the order of all elements in the given interval.
* @param arr array
* @param pos position of first element of the interval
* @param len length of the interval
*/
public static void reverse(final Object[] arr, final int pos, final int len) {
for(int l = pos, r = pos + len - 1; l < r; l++, r--) {
final Object tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
}
}
/**
* Returns a value for a new array size, which will always be larger than
* the specified value.
* @param old old size
* @return resulting size
*/
public static int newSize(final int old) {
return newSize(old, RESIZE);
}
/**
* Returns a value for a new array size, which will always be larger than
* the specified value.
* @param old old size
* @param factor resize factor; must be larger than or equal to 1
* @return resulting size
*/
public static int newSize(final int old, final double factor) {
return (int) (old * factor) + 1;
}
/**
* Swaps two entries of the given int array.
* @param arr array
* @param a first position
* @param b second position
*/
public static void swap(final int[] arr, final int a, final int b) {
final int c = arr[a];
arr[a] = arr[b];
arr[b] = c;
}
/**
* Swaps arr[a .. (a+n-1)] with arr[b .. (b+n-1)].
* @param arr order array
* @param a first offset
* @param b second offset
* @param n number of values
*/
public static void swap(final int[] arr, final int a, final int b,
final int n) {
for(int i = 0; i < n; ++i) swap(arr, a + i, b + i);
}
}