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;
}
}