T[] concatAll(T[] first, T[]... rest) {
int totalLength = first.length;
for (T[] array : rest) {
totalLength += array.length;
}
T[] result = Arrays.copyOf(first, totalLength);
int offset = first.length;
for (T[] array : rest) {
System.arraycopy(array, 0, result, offset, array.length);
offset += array.length;
}
return result;
}
/**
* Unions the two collections and returns the unified list.
*
* The elements is not compared with hashcode() or equals(). Comparator is used for the
* equality check.
*/
public static List union(
Collection originals, Collection toAdds, Comparator comparator) {
List result = new ArrayList<>(originals);
Collections.sort(result, comparator);
List resultToAdd = new ArrayList<>();
for (T toAdd : toAdds) {
if (Collections.binarySearch(result, toAdd, comparator) < 0) {
resultToAdd.add(toAdd);
}
}
result.addAll(resultToAdd);
return result;
}
/** Subtracts the elements from the original collection. */
public static List subtract(
Collection originals, T[] toSubtracts, Comparator comparator) {
List result = new ArrayList<>(originals);
Collections.sort(result, comparator);
for (T toSubtract : toSubtracts) {
int index = Collections.binarySearch(result, toSubtract, comparator);
if (index >= 0) {
result.remove(index);
}
}
return result;
}
/** Returns {@code true} if the two specified collections have common elements. */
public static boolean containsAny(
Collection c1, Collection c2, Comparator comparator) {
List contains = new ArrayList<>(c1);
Collections.sort(contains, comparator);
for (T iterate : c2) {
if (Collections.binarySearch(contains, iterate, comparator) >= 0) {
return true;
}
}
return false;
}
}