技术标签: 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
返回的结构,比一般效率还会更高。
使用的话,
contains
,get
…和基本的使用方法一致。
新结构 | 不变结构 |
---|---|
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 |
key
和value
到底是什么结构的呢,自己取舍吧。
方法 | 作用 |
---|---|
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);
});
});
}
更多办法,需要再自测。
*
有特殊操作,可以自行查阅文档,支持
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-SetRange 的set |
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;
}
};
内嵌一下,包装一下。
不过我感觉第一个就够我用了,其他的不看了。
水平不够,我用得上的就是那些新结构。
太高深的也用不上,更别说一些操作方法。
不用就说不上理解,脱离了实际使用都是空中楼阁。
先把那些蠢笨的办法换成流畅的数据结构再说吧。
文章浏览阅读831次,点赞29次,收藏17次。在游戏中,玩家攻击伤害计算是一个非常重要的功能,它决定了游戏中不同角色之间的战斗结果。本文将详细介绍Unity3D中玩家攻击伤害计算的实现方法,包括技术细节和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!Unity3D中玩家攻击伤害计算是游戏开发中一个重要的功能,通过合理设计攻击伤害计算的代码可以增强游戏的战斗体验。本文介绍了基本的攻击伤害计算原理和实现方法,以及一些进阶技术如暴击伤害计算和技能伤害计算。
文章浏览阅读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
文章浏览阅读4.2k次,点赞3次,收藏60次。工人工资系统,记录工人工资并导出数据。工地工人发放工资还是传统的手工方法,容易出现错误和丢失数据的情况,数据库系统可以有效的管理储存数据,减少操作。适合软件开发成员和项目经理阅读。苏日乐格,白松甫:需求分析董宏毅:概念结构设计倪安祥:逻辑结构设计雷智杰:数据库编程记录工人工资并且生成成批经办模板用于发放工资。项目经理可增删查改员工信息和工资。员工可查看个人信息和工资。数据库管理员进行数据库的运行和维护。一般约束、假设及对用户的要求。对现有系统(包括自动或人工的)进行简要分析。财务系统共有 5 个表,按照功能_python工资管理系统
文章浏览阅读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
文章浏览阅读3.1k次。在Python中使用数字生成金字塔有多种变体。让我们看一下两种最简单的形式示例foriinrange(5):forjinrange(i+1):print(j+1,end="")print("")输出结果这将给出输出112123123412345示例您也可以使用以下方式连续打印数字start=1foriinrange(5):forjinrange(i+1):..._用for嵌套循环打印出数字金字塔
文章浏览阅读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
文章浏览阅读8.1k次,点赞6次,收藏66次。最近课程学到模糊数学,里面有关于模糊矩阵乘法,传递闭包的概念,十分不好理解,本来想手算几个例子来理解的,结果算到一半就烦了还十分容易算错,于是我就打算用matlab编写一个。这里就不讲什么是模糊矩阵的乘法了。百度上能搜到的我这里就不赘述了,网上也有很多关于传递闭包的解释,都比较通俗易懂。我看到教材求传递闭包的方法就是模糊矩阵反复自乘,当结果t(.R)不改变的时候即为传递闭包的值。那么首先要编程..._模糊关系的matlab
文章浏览阅读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
文章浏览阅读592次。引用泄漏的背景:RxJava作为一种响应式编程框架,是目前编程界网红,可谓是家喻户晓,其简洁的编码风格、易用易读的链式方法调用、强大的异步支持等使得RxJava被广泛使用,它通过线程调度器更容易控制和切换线程,如果该工作线程还没执行结束就退出Activity或者Fragment,就会Activity或者Fragment无法释放引起内存泄漏。什么是Rxlifecycle?rxlifecycle..._rx subscribe 防止内存泄漏
文章浏览阅读173次。caffe的安装真是一个堪比西天取经的事。我用了几乎两天的时间才成功的安装。现在也是十分激动了。先说一下环境,我的是win8.1,装的是Microsoft的caffe。除了这一版,还有BLVC的caffe和happynear的caffe(with thirdparty),笔者均有尝试,but both failed。最初的环境是VS2017+python3.6。事实证明,用这个去装caff..._caffe windows 重新配置算力
文章浏览阅读8.7k次,点赞7次,收藏68次。一、安装Visual Studio Code官网:https://code.visualstudio.com/下载安装包后,按照默认安装即可安装中文语言环境点击左侧工具栏的 extensions 或者使用快捷键 Ctrl+Shift+X ,输入chinese,点击 Install 安装中文简体,之后重起 vscode 即可二、安装phpstudy我比较喜欢老版本的,安装包如下:链接:..._phpvscode环境配置