Guava库学习:学习Collections(三)Sets

    链接地址:http://www.xx566.com/detail/139.html

    上一篇,学习Collections(二)Lists中, 我们学习了使用Lists处理List实例,内部提供了许多有用的静态工厂方法,在Java开发中,我们经常提到三大集合:List、Set、 Map,List有序可重复,Set无序不可重复,Map通过键值对存储,这一篇,我们就来学习Collections中的Sets类,与Lists相 似,其内部也提供了许多静态工厂方法来处理Set实例。

 

    翻开源代码,我们看到,Sets内部使用了静态工厂方法代替构造器,提供了许多用于Set子类构造和操作的静态方法,我们简单的依次进行说明,如下:

immutableEnumSet( E anElement, E... otherElements):返回一个包含给定枚举元素的不可变的Set实例。

immutableEnumSet( Iterable<E> elements):返回一个包含给定枚举元素的不可变的Set实例。

 

newEnumSet(Iterable<E> iterable,Class<E> elementType):返回一个包含给定元素的EnumSet实例,与EnumSet#copyOf(Collection)方法不同,当给定集合为 空的时候,不会产生异常,它可以转换任何实现了Iterable接口的类,不仅仅是Collection。它会先根据传入的元素类型创建一个空的 EnumSet,再把给定的元素添加到EnumSet返回。

newHashSet():返回一个可变的空的HashSet实例。

newHashSet(E... elements):返回一个可变买的HashSet包含给定的元素。

newHashSetWithExpectedSize(int expectedSize):构造一个期望长度为expectedSize的HashSet实例。

newHashSet(Iterable<? extends E> elements):返回一个可变的HashSet包含给定的元素,给定元素实现Iterable接口。

newHashSet(Iterator<? extends E> elements):返回一个可变的HashSet包含给定的元素,给定元素实现Iterator接口。

 

newConcurrentHashSet():创建一个线程安全的Set,由ConcurrentHashMap的实例支持,因此进行了相同的并发性担保,与HashSet不同的是,这个Set不允许null元素,该Set是可序列化的。

newConcurrentHashSet( Iterable<? extends E> elements):创建一个线程安全的Set,包含给定的元素,由ConcurrentHashMap的实例支持,因此进行了相同的并发性担保,与 HashSet不同的是,这个Set不允许null元素,该Set是可序列化的。

 

newLinkedHashSet():创建一个可变的、空的LinkedHashSet实例。

newLinkedHashSetWithExpectedSize( int expectedSize):构造一个期望长度为expectedSize的LinkedHashSet实例。

newLinkedHashSet( Iterable<? extends E> elements):构造一个包含给定元素的LinkedHashSet实例。

 

newTreeSet():返回一个可变的空的TreeSet实例。

newTreeSet( Iterable<? extends E> elements):返回一个可变的包含给定元素的TreeSet实例。

newTreeSet(Comparator<? super E> comparator):创建一个具有给定的比较器可变TreeSet的实例。

 

newIdentityHashSet():创建一个空的Set,使用特性来确定是否相等。

newCopyOnWriteArraySet():创建一个空的CopyOnWriteArraySet实例。

newCopyOnWriteArraySet( Iterable<? extends E> elements):创建一个包含给定元素的CopyOnWriteArraySet实例。

 

complementOf(Collection<E> collection):创建一个EnumSet包括不属于指定集合中的所有枚举值。

complementOf( Collection<E> collection, Class<E> type):创建一个EnumSet包括不属于指定集合中的所有枚举值。

 

newSetFromMap(Map<E, Boolean> map):返回一个由给定map支持的Set。

union( final Set<? extends E> set1, final Set<? extends E> set2):返回两个set集合的并集的不可修改SetView。(若A和B是集合,则A和B并集是有所有A的元素和所有B的元素,而没有其他元素的集 合)

intersection( final Set<E> set1, final Set<?> set2):返回两个set集合的交集的不可修改SetView。(两个集合A 和 集合B 的交集是指含有所有既属于 A 又属于 B 的元素,而没有其他元素的集合)

difference( final Set<E> set1, final Set<?> set2):返回两个set集合的差的不可修改SetView。(A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做A与B的差集)

symmetricDifference( Set<? extends E> set1, Set<? extends E> set2):返回两个set集合的对称差的不可修改SetView。(对称差,即两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的 集合)

 

filter(Set<E> unfiltered, Predicate<? super E> predicate):返回传入Set集合unfiltered中满足给定Predicate的元素集合Set。

filter( SortedSet<E> unfiltered, Predicate<? super E> predicate):返回传入SortedSet集合unfiltered中满足给定Predicate的元素集合SortedSet。

filter( NavigableSet<E> unfiltered, Predicate<? super E> predicate):返回传入NavigableSet集合unfiltered中满足给定Predicate的元素集合NavigableSet。

 

cartesianProduct( List<? extends Set<? extends B>> sets):返回通过从各给定集中选择一个元素所形成每一个可能的集合。

cartesianProduct( Set<? extends B>... sets):返回通过从各给定集中选择一个元素所形成每一个可能的集合。

 

powerSet(Set<E> set):返回一个set,包含给定set的所有可能父级集合。

unmodifiableNavigableSet( NavigableSet<E> set):返回指定NavigableSet的不可修改视图。

synchronizedNavigableSet( NavigableSet<E> navigableSet):返回一个同步的(线程安全的)NavigableSet,由指定的NavigableSet支持。

 

    Sets类中提供的方法很多,我们这里对其中的一些重点和特别的方法做一些示例学习,其他的方法不再赘述,示例代码如下:

/**
 * Sets:处理Set实例的实用类
 * User: Realfighter
 * Date: 2014/9/3
 * Time: 20:00
 */
public class SetsTest {
 
    Set<Integer> set1;//测试用
    Set<Integer> set2;//测试用
 
    /**
     * 初始化测试集合
     */
    @Before
    public void setUp() {
        set1 = Sets.newHashSet(1, 2, 3, 4, 5);
        set2 = Sets.newHashSet(1, 3, 5, 7, 9);
    }
 
    /**
     * filter:返回传入Set集合unfiltered中满足给定Predicate的元素集合Set
     */
    @Test
    public void testFilter() {
        Set<String> set = Sets.newHashSet("i like u", "i miss u", "i love u");
        Predicate<String> predicate = new Predicate<String>() {
            @Override
            public boolean apply(String input) {
                //过滤包含字母l的元素
                return input.contains("l");
            }
        };
        //输出:[i like u, i love u]
        System.out.println(Sets.filter(set, predicate));
    }
 
    /**
     * difference:返回两个set集合的差的不可修改SetView
     * A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做A与B的差集
     */
    @Test
    public void testDifference() {
        //输出:[2, 4]
        System.out.println(Sets.difference(set1, set2));
    }
 
    /**
     * symmetricDifference:返回两个set集合的对称差的不可修改SetView
     * 对称差,即两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合
     */
    @Test
    public void testSymmetricDifference() {
        //输出:[2, 4, 9, 7]
        System.out.println(Sets.symmetricDifference(set1, set2));
    }
 
    /**
     * intersection:返回两个set集合的交集的不可修改SetView
     * 两个集合A和集合B的交集是指含有所有既属于A又属于B的元素,而没有其他元素的集合
     */
    @Test
    public void testIntersection() {
        //输出:[1, 3, 5]
        System.out.println(Sets.intersection(set1, set2));
    }
 
    /**
     * Union:返回两个set集合的并集的不可修改SetView
     * 若A和B是集合,则A和B并集是有所有A的元素和所有B的元素,而没有其他元素的集合
     */
    @Test
    public void testUnion() {
        //输出:[1, 2, 3, 4, 5, 9, 7]
        System.out.println(Sets.union(set1, set2));
    }
 
    /**
     * cartesianProduct:返回通过从各给定集中选择一个元素所形成每一个可能的集合
     */
    @Test
    public void testCartesianProduct() {
        Set<String> set1 = Sets.newHashSet("i love u", "i hate u");
        Set<String> set2 = Sets.newHashSet("tom", "jerry");
        Set<List<String>> sets = Sets.cartesianProduct(set1, set2);
        //输出:[[i hate u, tom], [i hate u, jerry], [i love u, tom], [i love u, jerry]]
        System.out.println(sets);
    }
 
    /**
     * powerSet:返回一个set,包含给定set的所有可能父级集合
     */
    @Test
    public void testPowerSet() {
        Set<String> set1 = Sets.newHashSet("i love u", "i hate u");
        Set<Set<String>> sets = Sets.powerSet(set1);
        for (Set<String> set : sets) {
            System.out.print(set);
        }
        //输出:[][i hate u][i love u][i hate u, i love u]
    }
 
}


转载于:https://my.oschina.net/realfighter/blog/349902

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值