Guava集合(一)新的集合类型篇

Guava引入了许多新的收集类型,这些类型不在JDK中,但是却十分有用。

Multiset

Multiset允许集合中插入重复的元素,Multiset只是一个实现类,其实现类有:

Multiset子类是否支持空元素
HashMultisetYes
TreeMultisetYes
LinkedHashMultisetYes
ConcurrentHashMultisetYes
ConcurrentHashMultisetNo
ConcurrentHashMultisetNo

示例:

   @Test
    public void testMultiSet () {
        Multiset<String> multiset = HashMultiset.create();
        multiset.addAll( Lists.newArrayList("I","love","China","China","is","my","love"));
        multiset.count("love");//2
        multiset.count("I");//1
        Set<String> elementSet = multiset.elementSet();
        System.out.println(elementSet);//[love, China, I, is, my]
        Set<Multiset.Entry<String>> entries = multiset.entrySet();//统计元素频次
        System.out.println(entries);//[love x 2, China x 2, I, is, my]
    }

SortedMultiset

SortedMultiset是能排序的multiSet,它只是一个接口,能够按照范围筛选子集,其实现类有TreeMultiset。

    @Test
    public void testTreeMultiset () {
//        TreeMultiset.create(Ordering.natural()); 默认就是字典序
        SortedMultiset<String> sortedMultiset = TreeMultiset.create();
        sortedMultiset.addAll( Lists.newArrayList("I","love","China","China","is","my","love"));
        sortedMultiset.count("love");//2
        sortedMultiset.count("I");//1
        Set<String> elementSet = sortedMultiset.elementSet();
        System.out.println(elementSet);//[China, I, is, love, my]
        Set<Multiset.Entry<String>> entries = sortedMultiset.entrySet();
        // 可以看到和HashMutiSet的区别,元素排好序了
        System.out.println(entries);//[China x 2, I, is, love x 2, my]
        // 按范围筛选子集合
        SortedMultiset<String> subMultiset = sortedMultiset.subMultiset("I", BoundType.CLOSED, "lovv", BoundType.OPEN);
        System.out.println(subMultiset);//[I, is, love x 2]
    }

Multimap

Multimap 用于key值相同value值不同的场景,即同一个key值有多个value

ImplementationKeys behave like…Values behave like…
ArrayListMultimapHashMapArrayList
HashMultimapHashMapHashSet
LinkedListMultimapLinkedHashMap* LinkedList*
LinkedHashMultimapLinkedHashMapLinkedHashSet
TreeMultimapTreeMapTreeSet
ImmutableListMultimapImmutableMapImmutableList
ImmutableSetMultimapImmutableMapImmutableSet

ArrayListMultimap示例:

    @Test
    public void testArrayListMultimap() {
//        value 值允许重复 类似于list
        Multimap<Object, Object> multimap = ArrayListMultimap.create();
        multimap.put("a","aa");
        multimap.put("a","aaa");
        multimap.put("b","bb");
        multimap.put("b","bbb");
        multimap.put("b","bbb");
        System.out.println(multimap);//{a=[aa, aaa], b=[bb, bbb]}
    }

HashMultimap 示例:

    @Test
    public void testHashMultimap() {
//        value 值不允许重复 类似于set
        Multimap<Object, Object> multimap = HashMultimap.create();
        multimap.put("a","aa");
        multimap.put("a","aaa");
        multimap.put("b","bb");
        multimap.put("b","bbb");
        multimap.put("b","bbb");
        System.out.println(multimap);//{a=[aa, aaa], b=[bb, bbb]}
    }

BiMap

双向映射,value值是唯一的 不允许重复,如果添加的value值已经存在了会报错。


    @Test
    public void testBiMap() {
//        value 值不允许重复 类似于set
        BiMap<Object, Object> biMap = HashBiMap.create();
        biMap.put("1","a");
//        biMap.put("2","a"); //抛出异常,java.lang.IllegalArgumentException: value already present: a
        System.out.println(biMap.get("1"));//a
//        biMap.inverse();
        System.out.println(biMap.inverse().get("a"));//1
    }

Table

@Test
public void testTable (){
Table<String, String, Double> weightedGraph = HashBasedTable.create();
weightedGraph.put(“v1”, “v2”, 4D);
weightedGraph.put(“v1”, “v3”, 20d);
weightedGraph.put(“v2”, “v3”, 5d);

    weightedGraph.row("v2"); // returns a Map mapping v2 to 4, v3 to 20
    weightedGraph.column("v3"); // returns a Map mapping v1 to 20, v2 to 5
}

RangeSet

 @Test
    public void testRangeSet (){
        RangeSet<Integer> rangeSet = TreeRangeSet.create();
        rangeSet.add(Range.closed(1, 10)); // {[1, 10]}
        rangeSet.add(Range.closedOpen(11, 15)); // disconnected range: {[1, 10], [11, 15)}
        rangeSet.add(Range.closedOpen(15, 20)); // connected range; {[1, 10], [11, 20)}
        rangeSet.add(Range.openClosed(0, 0)); // empty range; {[1, 10], [11, 20)}
        rangeSet.remove(Range.open(5, 10)); // splits [1, 10]; {[1, 5], [10, 10], [11, 20)}
        rangeSet.rangeContaining(2);//Range [1,5]
        rangeSet.rangeContaining(6);//null
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值