guava-集合_guava 元组-程序员宅基地

技术标签: guava  

结构

不变

python中一种结构,叫做元组

能切片,能遍历,能迭代,就是不能修改。

guava中也有,好处多多,而且底层做了更多,效率更高。

不能修改,仅此而已。

JDK Guava
Collection ImmutableCollection
List ImmutableList
Set ImmutableSet
SortedSet ImmutableSortedSet
Map ImmutableMap
SortedMap ImmutableSortedMap
  • 构造
方法(Immutable*) 说明
of 收集组合
copyOf 从数据集生成
sortedCopyOf 先排序,后生成
builder 构造器

Immutable*,看使用的是啥数据结构。

List的话就是ImmutableList

        ImmutableList.of(1,2,3,4,5,6,7,8,9).asList();
        ImmutableList.copyOf(new Integer[]{
    1,2,3,4,5,6,7,8,9}).asList();
        ImmutableList.copyOf(Arrays.asList(1,2,3,4,5,6,7,8,9)).asList();
        ImmutableList.builder()
                .add(1)
                .add(2,3,4)
                .add(new Integer[]{
    5,6})
                .addAll(Arrays.asList(7,8,9))
                .build().asList();

单个的,数组,迭代对象,都可以。

asList返回的结构,比一般效率还会更高。

  • 其他

使用的话,containsget…和基本的使用方法一致。

  • 更多
新结构 不变结构
Multiset ImmutableMultiset
SortedMultiset ImmutableSortedMultiset
Multimap ImmutableMultimap
ListMultimap ImmutableListMultimap
SetMultimap ImmutableSetMultimap
BiMap ImmutableBiMap
ClassToInstanceMap ImmutableClassToInstanceMap
Table ImmutableTable

这些都是guava中的新结构,后面叙述。

Multiset

  • 实现类
类别 底层实现 支持null
HashMultiset HashMap true
TreeMultiset TreeMap true
compartor是否支持
LinkedHashMultiset LinkedHashMap true
ConcurrentHashMultiset ConcurrentHashMap false
ImmutableMultiset ImmutableMap false
  • 相关方法
方法 描述
count(E) 计数
elementSet() 元素set
entrySet() 键值对set
add(E, int) 增加计数
remove(E, int) 减少计数
setCount(E, int) 设置计数
不可为负
size() 数量
addAll(iterator) 添加全部
  • 实验
    public static void main(String[] args) {
    
        HashMultiset<Integer> integers = HashMultiset.create();
        integers.addAll(Arrays.asList(1,2,3,4,5,6,7,8,9,1,2,3,4,8,9));
        integers.forEach(value-> System.out.println("value : " + value + "\tcount : " + integers.count(value)));
    }

可以看到,不会真的是set,仍然有重复。

    public static void main(String[] args) {
    
        HashMultiset<Integer> integers = HashMultiset.create();
        integers.addAll(Arrays.asList(1,2,3,4,5,6,7,8,9,1,2,3,4,8,9));
        integers
            .elementSet()
            .forEach(value-> System.out.println("value : " + value + "\tcount : " + integers.count(value)));
    }

去重效果更佳。

  • SortedMultiset

特异化结构,排序后加速范围限定查询。

Multimap

Map<K, List>,这个结构用的不会少。

一对多不会只有数据库才会存在,不过Map<K, List>是真的蠢。

于是Multimap出现了。

  • 实现类
实现类 key行为 value行为
ArrayListMultimap HashMap ArrayList
HashMultimap HashMap HashSet
LinkedListMultimap* LinkedHashMap* LinkedList*
LinkedHashMultimap** LinkedHashMap LinkedHashMap
TreeMultimap TreeMap TreeSet
ImmutableListMultimap ImmutableMap ImmutableList
ImmutableSetMultimap ImmutableMap ImmutableSet

keyvalue到底是什么结构的呢,自己取舍吧。

  • 方法
方法 作用
get(key) 获取value
put(K, V) 增加单个value
putAll(K, Iterabl e) 增加多个value
remove(K, V) 移除单个value
removeAll(K) 移除多个value
replaceValues(K, Ite rable) 替换value
asMap 转换为Map
entries 键值对
keySet 键集合
keys 键列表
values() 值列表
  • 实验
    public static void main(String[] args) {
    
        HashMultimap<String, String> hashMultimap = HashMultimap.create();
        hashMultimap.put("godme", "人民银行");
        hashMultimap.put("godme", "招商银行");
        hashMultimap.keySet().forEach(item -> {
    
            hashMultimap.get(item).forEach(item2 -> {
    
                System.out.println("account : " + item + "\tbank : " + item2);
            });
        });
    }

更多办法,需要再自测。

*有特殊操作,可以自行查阅文档,支持PDF下载哦。

BiMap

一般时候都是key->value,不过有时候也需要value->key

不过维护两个Map实在操蛋,现在方便多了。

  • 实现类
实现 key->value value->key
HashBiMap HashMap HashMap
ImmutableBiMap ImmutableMap ImmutableMap
EnumBiMap EnumMap EnumMap
EnumHashBiMap EnumMap EnumMap
  • 使用
    public static void main(String[] args) {
    
        HashBiMap<String, String> map = HashBiMap.create();
        map.forcePut("key", "value");
        System.out.println(map.inverse().get("value"));
    }

更多操作办法…可以翻源码。

记住就行,用到会查就行,记太多也不一定用到。

table

    public static void main(String[] args) {
    
        HashBasedTable<Integer,Integer ,Integer> table = HashBasedTable.create();
        table.put(1,1,11);
        table.put(2,2,22);
        table.column(1).put(2, 21);
        table.row(1).put(2, 12);
        System.out.println(table);
    }
row/column 1 2
1 11 12
2 21 22

反正我还用不到,看着就蛋疼。

ClassToInstanceMap

    public static void main(String[] args) {
    
        MutableClassToInstanceMap<Integer> table = MutableClassToInstanceMap.create();
        table.put(Integer.class, 12);
        table.put(Integer.class, 34);
        table.put(Integer.class, 56);
        table.put(Integer.class, 78);
        System.out.println(table.get(Integer.class));
    }

单例模式么这个,用不上。

RangeSet

    public static void main(String[] args) {
    
        TreeRangeSet<Integer> rangeSet = TreeRangeSet.create();
        rangeSet.add(Range.closed(1,2));
        rangeSet.add(Range.closed(2,3));
        rangeSet.add(Range.open(3,4));
        rangeSet.add(Range.closedOpen(5,6));
        rangeSet.add(Range.openClosed(7,8));
        System.out.println(rangeSet);
    }

数轴区间啊这是。

  • 查询
方法 作用
contains(C) 区间是否包含元素
rangeContaining(C) 返回包含区间
不包含回null
encloses(Range) 区间是否包含区间
span() 最小区间
  • 操作
方法 作用
complement() 补集
subRangeSet(Range) 交集
asRanges() Range-Set
Rangeset

RangeMap

rangeMap.put(Range.open(3, 6), "bar");
  • 为指定区间打标记。
  • 区间交集不合并
  • 方法
方法 作用
asMapOfRanges() Range-Map
subRangeMap(Range) 交集

工具

Iterables

方法 连接
concat(Iterable) 连接
frequency(Iterable, Object) 统计
partition(Iterable, in t) 拆分
elementsEqual(Iterable, Iterable) 比较
limit(Iterable, int) 限制
addAll(Collection addT o, Iterable toAdd) 添加
contains(Iterable, Object) 包含

更多方法自己查阅,毕竟结构体都不熟悉,看这些未免有点画蛇添足。

自定义

装饰(Forwarding*)

public class Null {
    
    public static void main(String[] args) {
    
        MyList list = new MyList<Integer>(56);
    }

    public static class MyList<T> extends ForwardingList {
    
        private ArrayList<T> sourceStruct;

        public MyList(int size) {
    
            sourceStruct = new ArrayList(size);
        }

        @Override
        protected List delegate() {
    
            return sourceStruct;
        }

    }
}

delegate:返回一个根源的数据管理对象即可

然后根据想拦截的方法进行改造即可。

Forwarding*:固定前缀,后面可选好多结构体

AbstractIterator

        new AbstractIterator<Integer>(){
    
            @Override
            protected Integer computeNext() {
    
                return null;
            }
        };

内嵌一下,包装一下。

不过我感觉第一个就够我用了,其他的不看了。

总结

水平不够,我用得上的就是那些新结构。

太高深的也用不上,更别说一些操作方法。

不用就说不上理解,脱离了实际使用都是空中楼阁。

先把那些蠢笨的办法换成流畅的数据结构再说吧。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wait_for_eva/article/details/83752699

智能推荐

Unity3D 玩家攻击伤害计算详解-程序员宅基地

文章浏览阅读831次,点赞29次,收藏17次。在游戏中,玩家攻击伤害计算是一个非常重要的功能,它决定了游戏中不同角色之间的战斗结果。本文将详细介绍Unity3D中玩家攻击伤害计算的实现方法,包括技术细节和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!Unity3D中玩家攻击伤害计算是游戏开发中一个重要的功能,通过合理设计攻击伤害计算的代码可以增强游戏的战斗体验。本文介绍了基本的攻击伤害计算原理和实现方法,以及一些进阶技术如暴击伤害计算和技能伤害计算。

dcmtk编译 android,Win10编译Android可用的DCMTK-SO库-程序员宅基地

文章浏览阅读260次。准备安装 win10 上的 Linux子系统(WSL),我选的是 ubuntu下载 linux 版本的 android-ndk, 我使用的版本是 android-ndk-r21-linux-x86_64 目前最新的版本下载 dcmtk 的 源码 ,我使用的版本号是3.6.5安装一个 Visual Studio,我使用的是2017版安装Cmake 编译工具首先说明一下,为了Android SO库的成..._arith.h dcmtk

基于Python的工人员工工资管理系统_python工资管理系统-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏60次。工人工资系统,记录工人工资并导出数据。工地工人发放工资还是传统的手工方法,容易出现错误和丢失数据的情况,数据库系统可以有效的管理储存数据,减少操作。适合软件开发成员和项目经理阅读。苏日乐格,白松甫:需求分析董宏毅:概念结构设计倪安祥:逻辑结构设计雷智杰:数据库编程记录工人工资并且生成成批经办模板用于发放工资。项目经理可增删查改员工信息和工资。员工可查看个人信息和工资。数据库管理员进行数据库的运行和维护。一般约束、假设及对用户的要求。对现有系统(包括自动或人工的)进行简要分析。财务系统共有 5 个表,按照功能_python工资管理系统

Python爬虫学习教程:天猫商品数据爬虫_nc_1_n1z-程序员宅基地

文章浏览阅读1.4k次,点赞11次,收藏23次。good_status = item.find(‘.productStatus’).text().replace(" “,”“).replace(“笔”,”“).replace(‘\n’,”“).replace(‘\r’,”")WebDriverWait(self.browser, 5, 0.5).until(EC.presence_of_element_located((By.ID, “nc_1_n1z”))) #等待滑动拖动控件出现。print(“总共页数” + page_total)_nc_1_n1z

絮凝剂聚合氯化铝的影响因素-程序员宅基地

文章浏览阅读733次。聚合氯化铝与传统无机混凝剂的根本区别在于传统无机混凝剂为低分子结晶盐,为无定形的无机高分子,因而表现出许多不同于传统混凝剂的特异混凝功能。宇森聚合氯化铝 15981896193 0371-64018578

python使用循环嵌套显示数字金字塔_如何使用Python生成数字金字塔?-程序员宅基地

文章浏览阅读3.1k次。在Python中使用数字生成金字塔有多种变体。让我们看一下两种最简单的形式示例foriinrange(5):forjinrange(i+1):print(j+1,end="")print("")输出结果这将给出输出112123123412345示例您也可以使用以下方式连续打印数字start=1foriinrange(5):forjinrange(i+1):..._用for嵌套循环打印出数字金字塔

随便推点

2015多校联合训练赛 hdu 5305 Friends 2015 Multi-University Training Contest 2 枚举+剪枝-程序员宅基地

文章浏览阅读849次。FriendsTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 249 Accepted Submission(s): 103Problem DescriptionThere are n people

模糊关系合成运算的Matlab实现_模糊关系的matlab-程序员宅基地

文章浏览阅读8.1k次,点赞6次,收藏66次。最近课程学到模糊数学,里面有关于模糊矩阵乘法,传递闭包的概念,十分不好理解,本来想手算几个例子来理解的,结果算到一半就烦了还十分容易算错,于是我就打算用matlab编写一个。这里就不讲什么是模糊矩阵的乘法了。百度上能搜到的我这里就不赘述了,网上也有很多关于传递闭包的解释,都比较通俗易懂。我看到教材求传递闭包的方法就是模糊矩阵反复自乘,当结果t(.R)不改变的时候即为传递闭包的值。那么首先要编程..._模糊关系的matlab

python列表索引超出范围 等于啥_python如何解决IndexError:列表索引超出范围?-问答-阿里云开发者社区-阿里云...-程序员宅基地

文章浏览阅读413次。我正在尝试为ucf101数据集生成密集流,但我不断收到以下错误:我尝试在第68行中将video_name.split('')[1]更改为video_name.split('')[0],已编译代码,但出现读取错误(请参见第70行)这是我尝试运行的python代码,但我一直在获取IndexError:列表索引超出范围:import os,sys import numpy as np import cv..._multiprocessing.pool , list index out of range

Android性能优化:Rxlifecycle解决RxJava内存泄漏_rx subscribe 防止内存泄漏-程序员宅基地

文章浏览阅读592次。引用泄漏的背景:RxJava作为一种响应式编程框架,是目前编程界网红,可谓是家喻户晓,其简洁的编码风格、易用易读的链式方法调用、强大的异步支持等使得RxJava被广泛使用,它通过线程调度器更容易控制和切换线程,如果该工作线程还没执行结束就退出Activity或者Fragment,就会Activity或者Fragment无法释放引起内存泄漏。什么是Rxlifecycle?rxlifecycle..._rx subscribe 防止内存泄漏

Windows 上Caffe的配置_caffe windows 重新配置算力-程序员宅基地

文章浏览阅读173次。caffe的安装真是一个堪比西天取经的事。我用了几乎两天的时间才成功的安装。现在也是十分激动了。先说一下环境,我的是win8.1,装的是Microsoft的caffe。除了这一版,还有BLVC的caffe和happynear的caffe(with thirdparty),笔者均有尝试,but both failed。最初的环境是VS2017+python3.6。事实证明,用这个去装caff..._caffe windows 重新配置算力

VScode+phpStudy搭建php代码调试环境_phpvscode环境配置-程序员宅基地

文章浏览阅读8.7k次,点赞7次,收藏68次。一、安装Visual Studio Code官网:https://code.visualstudio.com/下载安装包后,按照默认安装即可安装中文语言环境点击左侧工具栏的 extensions 或者使用快捷键 Ctrl+Shift+X ,输入chinese,点击 Install 安装中文简体,之后重起 vscode 即可二、安装phpstudy我比较喜欢老版本的,安装包如下:链接:..._phpvscode环境配置