1ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko/* 2ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Copyright (C) 2015 The Android Open Source Project 3ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * 4ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 5ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * you may not use this file except in compliance with the License. 6ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * You may obtain a copy of the License at 7ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * 8ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 9ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * 10ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Unless required by applicable law or agreed to in writing, software 11ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 12ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * See the License for the specific language governing permissions and 14ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * limitations under the License 15ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 16ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 17ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopackage com.android.tv.common; 18ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 1965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.ArrayList; 20ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport java.util.Arrays; 2165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.Collection; 2265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.Collections; 2365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.Comparator; 2465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.List; 25ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 26ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko/** 27ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Static utilities for collections 28ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 29ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopublic class CollectionUtils { 30ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 31ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 32ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Returns an array with the arrays concatenated together. 33ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * 34ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * @see <a href="http://stackoverflow.com/a/784842/1122089">Stackoverflow answer</a> by 35ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * <a href="http://stackoverflow.com/users/40342/joachim-sauer">Joachim Sauer</a> 36ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 37ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public static <T> T[] concatAll(T[] first, T[]... rest) { 38ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko int totalLength = first.length; 39ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko for (T[] array : rest) { 40ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko totalLength += array.length; 41ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 42ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko T[] result = Arrays.copyOf(first, totalLength); 43ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko int offset = first.length; 44ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko for (T[] array : rest) { 45ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko System.arraycopy(array, 0, result, offset, array.length); 46ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko offset += array.length; 47ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 48ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return result; 49ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 5065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 5165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 5265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Unions the two collections and returns the unified list. 5365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * <p> 5465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * The elements is not compared with hashcode() or equals(). Comparator is used for the equality 5565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * check. 5665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 5765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public static <T> List<T> union(Collection<T> originals, Collection<T> toAdds, 5865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Comparator<T> comparator) { 5965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko List<T> result = new ArrayList<>(originals); 6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Collections.sort(result, comparator); 6165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko List<T> resultToAdd = new ArrayList<>(); 6265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (T toAdd : toAdds) { 63d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko if (Collections.binarySearch(result, toAdd, comparator) < 0) { 6465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko resultToAdd.add(toAdd); 6565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 6665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 6765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko result.addAll(resultToAdd); 6865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return result; 6965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 7065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 7165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 7265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Subtracts the elements from the original collection. 7365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 7465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public static <T> List<T> subtract(Collection<T> originals, T[] toSubtracts, 7565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Comparator<T> comparator) { 7665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko List<T> result = new ArrayList<>(originals); 7765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Collections.sort(result, comparator); 7865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (T toSubtract : toSubtracts) { 7965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko int index = Collections.binarySearch(result, toSubtract, comparator); 80d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko if (index >= 0) { 8165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko result.remove(index); 8265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 8365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 8465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return result; 8565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 8665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 8765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 8865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Returns {@code true} if the two specified collections have common elements. 8965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 9065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public static <T> boolean containsAny(Collection<T> c1, Collection<T> c2, 9165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Comparator<T> comparator) { 9265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko List<T> contains = new ArrayList<>(c1); 9365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Collections.sort(contains, comparator); 9465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (T iterate : c2) { 95d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko if (Collections.binarySearch(contains, iterate, comparator) >= 0) { 9665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return true; 9765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 9865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 9965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return false; 10065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 101ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko} 102