每天进步一点点 --- Guava TreeMultiMap

来源
MultiMap允许键重复,代替了Map或Map的key是list的结构,是一个接口,具体的实现如下:
每天进步一点点 --- Guava TreeMultiMap_第1张图片
类图的继承关系如下,可以看到Multimap和Map类似只是一个接口,具体的实现需要使用下面的具体实现,本次尝试的TreeMultimap(可以根据值和key排序)。
每天进步一点点 --- Guava TreeMultiMap_第2张图片
创建
适合key和value不完全相同,并且可以根据key和value排序的数据结构。

案例1:添加key,value不完全相同的6个元素,此时size是6,先按照key自然排序,再按照value自然排序

        Multimap<String, Integer> mutiMap = TreeMultimap.create(); // 直接创建,根据key和value自然排序
        mutiMap.put("a", 1);
        mutiMap.put("a", 3);
        mutiMap.put("a", 2);
        mutiMap.put("b", 2);
        mutiMap.put("b", 1);
        mutiMap.put("c", 2);
        //System.out.println(mutiMap.toString());  // {a=[1, 2, 3], b=[1, 2], c=[2]}
        System.out.println(mutiMap.size());  //6

案例2:添加key,value完全相同的元素时,size仍然是6,说明key,value完全相同则添加不成功

        Multimap<String, Integer> mutiMap = TreeMultimap.create(); // 直接创建,根据key和value自然排序
        mutiMap.put("a", 1);
        mutiMap.put("a", 3);
        mutiMap.put("a", 2);
        mutiMap.put("b", 2);
        mutiMap.put("b", 1);
        mutiMap.put("c", 2);
        mutiMap.put("a",1); // 添加一个key相等,value也相等的元素时,不会添加
        System.out.println(mutiMap.toString());  // {a=[1, 2, 3], b=[1, 2], c=[2]}
        System.out.println(mutiMap.size());  //6

案例3:指定排序方式时,也是先按照key排序,再按照value排序,按照指定的排序方式即可

        TreeMultimap<String, Integer> mutiTreeMap = TreeMultimap.create(Ordering.natural().reversed(), (o1, o2) -> o2 - o1); // 指定key和value排序方式
        mutiTreeMap.put("a", 1);
        mutiTreeMap.put("a", 3);
        mutiTreeMap.put("a", 2);
        mutiTreeMap.put("b", 2);
        mutiTreeMap.put("b", 1);
        mutiTreeMap.put("c", 2);
        System.out.println(mutiTreeMap.toString()); // {c=[2], b=[2, 1], a=[3, 2, 1]}
        System.out.println(mutiTreeMap.size()); // 6

案例4:key排序给定值时,情况如下
(1)key都认为相等,则size为所有value的set集合,key取第一个加入的元素
(2)key都认为后面的大,即比较返回1,则认为key都不相同,value自然也不排序了,按照key的自然顺序排序

        TreeMultimap<String, Integer> mutiTreeMap = TreeMultimap.create((o1, o2) -> 0, (o1, o2) -> o2 - o1); // 指定key和value排序方式
        mutiTreeMap.put("a", 1);
        mutiTreeMap.put("a", 3);
        mutiTreeMap.put("a", 2);
        mutiTreeMap.put("b", 2);
        mutiTreeMap.put("b", 4);
        mutiTreeMap.put("c", 2);
        System.out.println(mutiTreeMap.toString()); // {a=[4, 3, 2, 1]}
        System.out.println(mutiTreeMap.size()); // 4
        TreeMultimap<String, Integer> mutiTreeMap = TreeMultimap.create((o1, o2) -> 1, (o1, o2) -> o2 - o1); // 指定key和value排序方式
        mutiTreeMap.put("a", 1);
        mutiTreeMap.put("a", 3);
        mutiTreeMap.put("a", 2);
        mutiTreeMap.put("b", 2);
        mutiTreeMap.put("b", 4);
        mutiTreeMap.put("c", 2);
        System.out.println(mutiTreeMap.toString()); // {a=[4, 3, 2, 1]}
        System.out.println(mutiTreeMap.size()); // 4

案例5:按照value定值排序
(1)value认为都相等时,可以看到key按照自然排序,value只保留了一个,即认为a,1和a,3是一样的,只保留一个。

        TreeMultimap<String, Integer> mutiTreeMap = TreeMultimap.create(Ordering.natural(), (o1, o2) -> 0); // 指定key和value排序方式
        mutiTreeMap.put("a", 1);
        mutiTreeMap.put("a", 3);
        mutiTreeMap.put("a", 2);
        mutiTreeMap.put("b", 2);
        mutiTreeMap.put("b", 4);
        mutiTreeMap.put("c", 2);
        System.out.println(mutiTreeMap.toString()); // {a=[1], b=[2], c=[2]}
        System.out.println(mutiTreeMap.size()); // 3

案例6:按照现有multiMap复制,一个添加之后,另一个没有变化,可以看出是深拷贝

        TreeMultimap<String, Integer> mutiTreeMap = TreeMultimap.create(Ordering.natural().reversed(), (o1, o2) -> o2 - o1); // 指定key和value排序方式
        mutiTreeMap.put("a", 1);
        mutiTreeMap.put("a", 3);
        mutiTreeMap.put("a", 2);
        mutiTreeMap.put("b", 2);
        mutiTreeMap.put("b", 1);
        mutiTreeMap.put("c", 2);
        System.out.println(mutiTreeMap.toString()); // {c=[2], b=[2, 1], a=[3, 2, 1]}
        System.out.println(mutiTreeMap.size()); // 6

        TreeMultimap<String, Integer> multimap = TreeMultimap.create(mutiTreeMap); 
        System.out.println(multimap.toString());
        System.out.println(multimap.size());

        mutiTreeMap.put("a", 5);
        System.out.println(mutiTreeMap.toString() + ":" + mutiTreeMap.size());//{c=[2], b=[2, 1], a=[5, 3, 2, 1]}:7
        System.out.println(multimap.toString() + ":" + multimap.size());// {a=[1, 2, 3], b=[1, 2], c=[2]}:6

获取与遍历
案例1:get某个key后的遍历,get之后需要使用NavigableSet的父类或者接口接收,NavigableSet本身就有大于、小于、遍历、最开始、最后元素等方法。

        TreeMultimap<String, Integer> mutiTreeMap = TreeMultimap.create(Ordering.natural().reversed(), (o1, o2) -> o2 - o1); // 指定key和value排序方式
        mutiTreeMap.put("a", 1);
        mutiTreeMap.put("a", 3);
        mutiTreeMap.put("a", 4);
        Collection<Integer> result = mutiTreeMap.get("a");
        System.out.println(result); //[4, 3, 1]
        System.out.println(mutiTreeMap.toString()); // {a=[4, 3, 1]}
        System.out.println(mutiTreeMap.get("a").pollLast()); // 1
        System.out.println(mutiTreeMap.toString()); // {a=[4,3]}
        mutiTreeMap.get("a").forEach(System.out::println); // 4 3

案例2:TreeMultimap的遍历

        TreeMultimap<String, Integer> mutiTreeMap = TreeMultimap.create(Ordering.natural().reversed(), (o1, o2) -> o2 - o1); // 指定key和value排序方式
        mutiTreeMap.put("a", 1);
        mutiTreeMap.put("a", 3);
        mutiTreeMap.put("a", 4);
        mutiTreeMap.forEach((key, value) -> {
            System.out.println(key); // a a a
        });

        mutiTreeMap.forEach((key, value) -> {
            System.out.println(value); // 4 3 1
        });
        Iterator iterator = mutiTreeMap.entries().iterator();
        if (iterator.hasNext()) {
            System.out.println(iterator.next().toString()); // a=4
        }

修改
没有找到直接修改的方法,不知道List的修改是否会生效,不过remove和put也可以实现

        TreeMultimap<String, Integer> mutiTreeMap = TreeMultimap.create(Ordering.natural().reversed(), (o1, o2) -> o2 - o1); // 指定key和value排序方式
        mutiTreeMap.put("a", 1);
        mutiTreeMap.put("a", 6);
        mutiTreeMap.forEach((key, value) -> System.out.println(key + ":" + value)); // a:6 a:1
        mutiTreeMap.get("a").forEach(o1 -> o1 = 5);
        mutiTreeMap.forEach((key, value) -> System.out.println(key + ":" + value)); // a:6 a:1
        Collection <Integer> tmp = mutiTreeMap.get("a");
        mutiTreeMap.remove("a",1);
        mutiTreeMap.forEach((key, value) -> System.out.println(key + ":" + value)); // a:6
        mutiTreeMap.put("a",7);
        mutiTreeMap.forEach((key, value) -> System.out.println(key + ":" + value)); // a:7 a:6

你可能感兴趣的:(JAVA基础,guava,数据结构,java)