19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.google.android.collect; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1943f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkeyimport android.util.ArraySet; 2043f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.EnumSet; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.SortedSet; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.TreeSet; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Provides static methods for creating mutable {@code Set} instances easily and 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other static methods for working with Sets. 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Sets { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates an empty {@code HashSet} instance. 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Note:</b> if {@code E} is an {@link Enum} type, use {@link 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * EnumSet#noneOf} instead. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Note:</b> if you only need an <i>immutable</i> empty Set, 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use {@link Collections#emptySet} instead. 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a newly-created, initially-empty {@code HashSet} 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static <K> HashSet<K> newHashSet() { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new HashSet<K>(); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar /** 50049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * Creates a {@code HashSet} instance containing the given elements. 51049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * 52049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * <p><b>Note:</b> due to a bug in javac 1.5.0_06, we cannot support the 53049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * following: 54049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * 55049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * <p>{@code Set<Base> set = Sets.newHashSet(sub1, sub2);} 56049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * 57049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * <p>where {@code sub1} and {@code sub2} are references to subtypes of {@code 58049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * Base}, not of {@code Base} itself. To get around this, you must use: 59049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * 60049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * <p>{@code Set<Base> set = Sets.<Base>newHashSet(sub1, sub2);} 61049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * 62049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * @param elements the elements that the set should contain 63049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * @return a newly-created {@code HashSet} containing those elements (minus 64049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * duplicates) 65049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar */ 66049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar public static <E> HashSet<E> newHashSet(E... elements) { 67049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar int capacity = elements.length * 4 / 3 + 1; 68049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar HashSet<E> set = new HashSet<E>(capacity); 69049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar Collections.addAll(set, elements); 70049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar return set; 71049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar /** 74049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * Creates an empty {@code SortedSet} instance. 75049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * 76049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * @return a newly-created, initially-empty {@code SortedSet}. 77049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar */ 78049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar public static <E> SortedSet<E> newSortedSet() { 79049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar return new TreeSet<E>(); 80049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar } 81049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar 82049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar /** 83049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * Creates a {@code SortedSet} instance containing the given elements. 84049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * 85049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * @param elements the elements that the set should contain 86049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * @return a newly-created {@code SortedSet} containing those elements (minus 87049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar * duplicates) 88049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar */ 89049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar public static <E> SortedSet<E> newSortedSet(E... elements) { 90049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar SortedSet<E> set = new TreeSet<E>(); 91049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar Collections.addAll(set, elements); 92049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar return set; 93049070d365c41a6beb81b4936b9fcc99a9549bf9Evan Millar } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9543f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey /** 9643f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey * Creates a {@code ArraySet} instance. 9743f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey */ 9843f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey public static <E> ArraySet<E> newArraySet() { 9943f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey return new ArraySet<E>(); 10043f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey } 10143f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey 10243f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey /** 10343f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey * Creates a {@code ArraySet} instance containing the given elements. 10443f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey */ 10543f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey public static <E> ArraySet<E> newArraySet(E... elements) { 10643f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey int capacity = elements.length * 4 / 3 + 1; 10743f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey ArraySet<E> set = new ArraySet<E>(capacity); 10843f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey Collections.addAll(set, elements); 10943f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey return set; 11043f4263a854e9043d6ae3eeaa6b227afe95f1c57Jeff Sharkey } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 112