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