001 /*
002 * Created on May 12, 2008
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 *
014 * Copyright @2008-2010 the original author or authors.
015 */
016 package org.fest.swing.util;
017
018 import static org.fest.util.Objects.areEqual;
019 import static org.fest.util.Strings.quote;
020 import static org.fest.util.Systems.LINE_SEPARATOR;
021
022 import java.lang.reflect.Array;
023
024 /**
025 * Understands utility methods for arrays.
026 *
027 * @author Alex Ruiz
028 */
029 public final class Arrays {
030
031 private static final String NO_COLUMNS = "[[]]";
032 private static final String NO_ROWS = "[]";
033 private static final String NULL = "null";
034
035 /**
036 * Verifies that the given <code>String</code> arrays are equal.
037 * @param one the first array.
038 * @param two the second array.
039 * @return <code>true</code> if the arrays are equal, <code>false</code> otherwise.
040 */
041 public static boolean equal(String[][] one, String[][] two) {
042 if (one == null && two == null) return true;
043 if (one == null || two == null) return false;
044 if (one.length != two.length) return false;;
045 if (one.length == 0) return true;
046 if (one[0].length != two[0].length) return false;
047 for (int i = 0; i < one.length; i++)
048 for (int j = 0; j < one[i].length; j++)
049 if (!areEqual(one[i][j], two[i][j])) return false;
050 return true;
051 }
052
053 /**
054 * Formats a two-dimensional <code>String</code> array. For example, the array:
055 * <pre>
056 * String[][] array = {
057 * { "0-0", "0-1", "0-2" },
058 * { "1-0", "1-1", "1-2" },
059 * { "2-0", "2-1", "2-2" },
060 * { "3-0", "3-1", "3-2" }, };
061 * </pre>
062 * will be formatted as:
063 * <pre>
064 * [['0-0', '0-1', '0-2'],
065 * ['1-0', '1-1', '1-2'],
066 * ['2-0', '2-1', '2-2'],
067 * ['3-0', '3-1', '3-2']]
068 * </pre>
069 *
070 * @param array the array to format.
071 * @return the data of the given array formatted to make it easier to read.
072 */
073 public static String format(String[][] array) {
074 if (array == null) return NULL;
075 int size = array.length;
076 if (size == 0) return NO_ROWS;
077 if (array[0].length == 0) return NO_COLUMNS;
078 StringBuilder b = new StringBuilder();
079 b.append("[");
080 for (int i = 0; i < size; i++) {
081 if (i != 0) b.append(LINE_SEPARATOR).append(" ");
082 addLine(array[i], b);
083 if (i != size - 1) b.append(",");
084 }
085 b.append("]");
086 return b.toString();
087 }
088
089 private static void addLine(String[] line, StringBuilder b) {
090 int lineSize = line.length;
091 b.append("[");
092 for (int i = 0; i < lineSize; i++) {
093 b.append(quote(line[i]));
094 if (i != lineSize - 1) b.append(", ");
095 }
096 b.append("]");
097 }
098
099 /**
100 * Creates and returns a copy of the given array.
101 * @param array the array to copy.
102 * @return the created copy.
103 * @throws NullPointerException if the array to copy is <code>null</code>.
104 */
105 public static int[] copyOf(int[] array) {
106 if (array == null) throw new NullPointerException("The array to copy should not be null");
107 int arraySize = array.length;
108 int[] copy = new int[arraySize];
109 for (int i = 0; i < arraySize; i++) copy[i] = array[i];
110 return copy;
111 }
112
113
114 /**
115 * Creates and returns a copy of the given array.
116 * @param <T> the generic type of the array.
117 * @param array the array to copy.
118 * @return the created copy.
119 * @throws NullPointerException if the array to copy is <code>null</code>.
120 */
121 @SuppressWarnings("unchecked") public static <T> T[] copyOf(T[] array) {
122 if (array == null) throw new NullPointerException("The array to copy should not be null");
123 int arraySize = array.length;
124 T[] copy = (T[])Array.newInstance(array.getClass().getComponentType(), arraySize);
125 for (int i = 0; i < arraySize; i++) copy[i] = array[i];
126 return copy;
127 }
128
129 /**
130 * Indicates whether the given array is <code>null</code> or empty.
131 * @param array the array to check.
132 * @return <code>true</code> if the given array is <code>null</code> or empty; <code>false</code> otherwise.
133 */
134 public static boolean isEmptyIntArray(int[] array) {
135 return array == null || array.length == 0;
136 }
137
138 private Arrays() {}
139 }