1 /** 2 * Copyright (c) 2012, University of Konstanz, Distributed Systems Group 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * * Neither the name of the University of Konstanz nor the 13 * names of its contributors may be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 package org.perfidix.example.list; 28 29 import java.util.Arrays; 30 31 /** 32 * This class provides convenience methods for handling arrays and serves as an 33 * extension to the {@link Arrays} class of Java. 34 * 35 * @author BaseX Team 2005-11, BSD License 36 * @author Christian Gruen 37 */ 38 public final class Array { 39 /** Default factor for resizing dynamic arrays. */ 40 public static final double RESIZE = 1.5; 41 42 /** Private constructor. */ 43 private Array() { 44 } 45 46 /** 47 * Copies the specified array. 48 * 49 * @param a 50 * array to be copied 51 * @param s 52 * new array size 53 * @return new array 54 */ 55 public static byte[][] copyOf(final byte[][] a, final int s) { 56 final byte[][] tmp = new byte[s][]; 57 System.arraycopy(a, 0, tmp, 0, Math.min(s, a.length)); 58 return tmp; 59 } 60 61 /** 62 * Copies the specified array. 63 * 64 * @param a 65 * array to be copied 66 * @param s 67 * new array size 68 * @return new array 69 */ 70 public static int[][] copyOf(final int[][] a, final int s) { 71 final int[][] tmp = new int[s][]; 72 System.arraycopy(a, 0, tmp, 0, Math.min(s, a.length)); 73 return tmp; 74 } 75 76 /** 77 * Copies the specified array. 78 * 79 * @param a 80 * array to be copied 81 * @param s 82 * new array size 83 * @return new array 84 */ 85 public static String[] copyOf(final String[] a, final int s) { 86 final String[] tmp = new String[s]; 87 System.arraycopy(a, 0, tmp, 0, Math.min(s, a.length)); 88 return tmp; 89 } 90 91 /** 92 * Adds an entry to the end of an array and returns the new array. 93 * 94 * @param ar 95 * array to be resized 96 * @param e 97 * entry to be added 98 * @param <T> 99 * array type 100 * @return array 101 */ 102 public static <T> T[] add(final T[] ar, final T e) { 103 final int s = ar.length; 104 final T[] t = Arrays.copyOf(ar, s + 1); 105 t[s] = e; 106 return t; 107 } 108 109 /** 110 * Adds an entry to the end of an array and returns the new array. 111 * 112 * @param ar 113 * array to be resized 114 * @param e 115 * entry to be added 116 * @return array 117 */ 118 public static int[] add(final int[] ar, final int e) { 119 final int s = ar.length; 120 final int[] t = Arrays.copyOf(ar, s + 1); 121 t[s] = e; 122 return t; 123 } 124 125 /** 126 * Moves entries inside an array. 127 * 128 * @param ar 129 * array 130 * @param pos 131 * position 132 * @param off 133 * move offset 134 * @param l 135 * length 136 */ 137 public static void move(final Object ar, final int pos, final int off, final int l) { 138 System.arraycopy(ar, pos, ar, pos + off, l); 139 } 140 141 /** 142 * Removes an array entry at the specified position. 143 * 144 * @param ar 145 * array to be resized 146 * @param p 147 * position 148 * @param <T> 149 * array type 150 * @return array 151 */ 152 public static <T> T[] delete(final T[] ar, final int p) { 153 final int s = ar.length - 1; 154 move(ar, p + 1, -1, s - p); 155 return Arrays.copyOf(ar, s); 156 } 157 158 /** 159 * Reverses the order of the elements in the given array. 160 * 161 * @param arr 162 * array 163 */ 164 public static void reverse(final byte[] arr) { 165 reverse(arr, 0, arr.length); 166 } 167 168 /** 169 * Reverses the order of all elements in the given interval. 170 * 171 * @param arr 172 * array 173 * @param pos 174 * position of first element of the interval 175 * @param len 176 * length of the interval 177 */ 178 public static void reverse(final byte[] arr, final int pos, final int len) { 179 for (int l = pos, r = pos + len - 1; l < r; l++, r--) { 180 final byte tmp = arr[l]; 181 arr[l] = arr[r]; 182 arr[r] = tmp; 183 } 184 } 185 186 /** 187 * Reverses the order of all elements in the given interval. 188 * 189 * @param arr 190 * array 191 * @param pos 192 * position of first element of the interval 193 * @param len 194 * length of the interval 195 */ 196 public static void reverse(final Object[] arr, final int pos, final int len) { 197 for (int l = pos, r = pos + len - 1; l < r; l++, r--) { 198 final Object tmp = arr[l]; 199 arr[l] = arr[r]; 200 arr[r] = tmp; 201 } 202 } 203 204 /** 205 * Returns a value for a new array size, which will always be larger than 206 * the specified value. 207 * 208 * @param old 209 * old size 210 * @return resulting size 211 */ 212 public static int newSize(final int old) { 213 return newSize(old, RESIZE); 214 } 215 216 /** 217 * Returns a value for a new array size, which will always be larger than 218 * the specified value. 219 * 220 * @param old 221 * old size 222 * @param factor 223 * resize factor; must be larger than or equal to 1 224 * @return resulting size 225 */ 226 public static int newSize(final int old, final double factor) { 227 return (int)(old * factor) + 1; 228 } 229 230 /** 231 * Swaps two entries of the given int array. 232 * 233 * @param arr 234 * array 235 * @param a 236 * first position 237 * @param b 238 * second position 239 */ 240 public static void swap(final int[] arr, final int a, final int b) { 241 final int c = arr[a]; 242 arr[a] = arr[b]; 243 arr[b] = c; 244 } 245 246 /** 247 * Swaps arr[a .. (a+n-1)] with arr[b .. (b+n-1)]. 248 * 249 * @param arr 250 * order array 251 * @param a 252 * first offset 253 * @param b 254 * second offset 255 * @param n 256 * number of values 257 */ 258 public static void swap(final int[] arr, final int a, final int b, final int n) { 259 for (int i = 0; i < n; ++i) 260 swap(arr, a + i, b + i); 261 } 262 }