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 17944779887775bd950cf1abf348d2df461593f6abLive Channels Teampackage com.android.tv.common.util; 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 2695961816a768da387f0b5523cf4363ace2044089Nick Chalko/** Static utilities for collections */ 27ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopublic class CollectionUtils { 28ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 29ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 30ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Returns an array with the arrays concatenated together. 31ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * 3295961816a768da387f0b5523cf4363ace2044089Nick Chalko * @see <a href="http://stackoverflow.com/a/784842/1122089">Stackoverflow answer</a> by <a 3395961816a768da387f0b5523cf4363ace2044089Nick Chalko * href="http://stackoverflow.com/users/40342/joachim-sauer">Joachim Sauer</a> 34ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 35ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public static <T> T[] concatAll(T[] first, T[]... rest) { 36ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko int totalLength = first.length; 37ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko for (T[] array : rest) { 38ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko totalLength += array.length; 39ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 40ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko T[] result = Arrays.copyOf(first, totalLength); 41ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko int offset = first.length; 42ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko for (T[] array : rest) { 43ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko System.arraycopy(array, 0, result, offset, array.length); 44ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko offset += array.length; 45ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 46ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return result; 47ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 4865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 4965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 5065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Unions the two collections and returns the unified list. 5195961816a768da387f0b5523cf4363ace2044089Nick Chalko * 5295961816a768da387f0b5523cf4363ace2044089Nick Chalko * <p>The elements is not compared with hashcode() or equals(). Comparator is used for the 5395961816a768da387f0b5523cf4363ace2044089Nick Chalko * equality check. 5465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 5595961816a768da387f0b5523cf4363ace2044089Nick Chalko public static <T> List<T> union( 5695961816a768da387f0b5523cf4363ace2044089Nick Chalko Collection<T> originals, Collection<T> toAdds, Comparator<T> comparator) { 5765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko List<T> result = new ArrayList<>(originals); 5865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Collections.sort(result, comparator); 5965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko List<T> resultToAdd = new ArrayList<>(); 6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (T toAdd : toAdds) { 61d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko if (Collections.binarySearch(result, toAdd, comparator) < 0) { 6265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko resultToAdd.add(toAdd); 6365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 6465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 6565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko result.addAll(resultToAdd); 6665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return result; 6765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 6865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 6995961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Subtracts the elements from the original collection. */ 7095961816a768da387f0b5523cf4363ace2044089Nick Chalko public static <T> List<T> subtract( 7195961816a768da387f0b5523cf4363ace2044089Nick Chalko Collection<T> originals, T[] toSubtracts, Comparator<T> comparator) { 7265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko List<T> result = new ArrayList<>(originals); 7365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Collections.sort(result, comparator); 7465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (T toSubtract : toSubtracts) { 7565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko int index = Collections.binarySearch(result, toSubtract, comparator); 76d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko if (index >= 0) { 7765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko result.remove(index); 7865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 7965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 8065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return result; 8165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 8265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 8395961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Returns {@code true} if the two specified collections have common elements. */ 8495961816a768da387f0b5523cf4363ace2044089Nick Chalko public static <T> boolean containsAny( 8595961816a768da387f0b5523cf4363ace2044089Nick Chalko Collection<T> c1, Collection<T> c2, Comparator<T> comparator) { 8665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko List<T> contains = new ArrayList<>(c1); 8765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Collections.sort(contains, comparator); 8865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (T iterate : c2) { 89d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko if (Collections.binarySearch(contains, iterate, comparator) >= 0) { 9065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return true; 9165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 9265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 9365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return false; 9465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 95ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko} 96