collection包1.1.0都升级了什么功能
collection包1.1.0都升级了什么功能
jianfengye/collection(https://github.com/jianfengye/collection) 这个包喜迎第一个子版本升级,从1.0.1升级到了1.1.0。这次还是做了不少改动的。
支持int32
这个需求是这个issue提出的: https://github.com/jianfengye/collection/issues/10
主要是在protobuf 生成的go代码里面是int32,int64的。
增加一个类型的数组其实是很方便的事情了,只需要写一个Int32Collection的struct, 基于AbsCollection,实现几个必要的函数就可以了。
package collection
import (
"errors"
"fmt"
)
type Int32Collection struct {
AbsCollection
objs []int32
}
func compareInt32(i interface{}, i2 interface{}) int {
int1 := i.(int32)
int2 := i2.(int32)
if int1 > int2 {
return 1
}
if int1 < int2 {
return -1
}
return 0
}
// NewInt32Collection create a new Int32Collection
func NewInt32Collection(objs []int32) *Int32Collection {
arr := &Int32Collection{
objs: objs,
}
arr.AbsCollection.Parent = arr
arr.SetCompare(compareInt32)
return arr
}
...
实现延迟复制
这个是有一个读者在公众号留言提醒的。之前1.0.1版本的collection在new的时候直接将slice进行copy一份,是出于安全的考虑,Collection的使用一定不能修改到原有的slice。现在1.1.0在newCollection的时候并不复制slice,而是在需要对slice进行乱序或者变更操作的时候进行一次Copy操作。而我把Copy操作的时间也放到各个具体实现类中了。
于是ICollection多实现了一个Copy方法,它会把当前Collection的Slice复制一份出来。然后在AbsCollection中记录一个是否已经拷贝的标记,isCopied,对于那些对原数组进行操作的方法会根据这个标记,如果之前没有复制,就复制一份,再进行操作
func (arr *AbsCollection) Insert(index int, obj interface{}) ICollection {
if arr.Err() != nil {
return arr
}
if arr.Parent == nil {
panic("no parent")
}
if arr.isCopied == false {
arr.Copy()
arr.isCopied = true
}
return arr.Parent.Insert(index, obj)
}
这样就实现了延迟拷贝的功能。
实现了SetIndex的方法
这个方法和Index方法是对应的,将数组的某个元素进行设置。
这个方法的具体实现也在实现类中实现了,特别是对ObjCollection的SetIndex实现还是需要reflect进行绕的,其他的COllection不需要使用反射。
func (arr *ObjCollection) SetIndex(i int, val interface{}) ICollection {
arr.objs.Index(i).Set(reflect.ValueOf(val))
return arr
}
Sort实现了快速排序
这个是这个issue提出的 https://github.com/jianfengye/collection/issues/9
之前的Sort我是使用冒泡排序实现的,确实效率有欠考虑。
这次将Sort进行了快排实现。由于已经又了SetIndex, Index, 等方法,所以可以这个快排可以直接在AbsCollection中实现就行了。
func (arr *AbsCollection) qsort(left, right int, isAscOrder bool) {
tmp := arr.Index(left)
p := left
i, j := left, right
for i <= j {
for j >= p {
c, err := arr.Index(j).Compare(tmp)
if err != nil {
arr.SetErr(err)
return
}
if isAscOrder && c >= 0 {
j--
continue
}
if !isAscOrder && c <= 0 {
j--
continue
}
break
}
if j >= p {
t, _ := arr.Index(j).ToInterface()
arr.SetIndex(p, t)
p = j
}
for i <= p {
c, err := arr.Index(i).Compare(tmp)
if err != nil {
arr.SetErr(err)
return
}
if isAscOrder && c <= 0 {
i++
continue
}
if !isAscOrder && c >= 0 {
i++
continue
}
break
}
if i <= p {
t, _ := arr.Index(i).ToInterface()
arr.SetIndex(p, t)
p = i
}
}
t, _ := tmp.ToInterface()
arr.SetIndex(p, t)
if p-left > 1 {
arr.qsort(left, p-1, isAscOrder)
}
if right-p > 1 {
arr.qsort(p+1, right, isAscOrder)
}
}
func (arr *AbsCollection) Sort() ICollection {
if arr.Err() != nil {
return arr
}
if arr.compare == nil {
return arr.SetErr(errors.New("sort: compare must be set"))
}
if arr.isCopied {
arr.qsort(0, arr.Count()-1, true)
return arr
}
arr.Copy()
return arr.Sort()
}
compare函数进行传递
之前IMix的compare函数一定都需要调用SetCompare才能设置,现在如果这个IMix是从Collection进行创建的,比如Collection.Index(xx) IMix, 返回的IMix就直接将Collection中设置的compare函数直接传递过来。
这样在使用过程中方便了不少。
我也将各个类型的compare函数都整理在具体实现类的头部
func compareInt32(i interface{}, i2 interface{}) int
func compareInt64(i interface{}, i2 interface{}) int
func compareInt(i interface{}, i2 interface{}) int
func compareString(a interface{}, b interface{}) int
...
总结
1.1.0版本主要是根据issue反馈修复了一些使用和性能上的优化点。总体觉得已经可以发一个小版本了,于是打上了1.1.0的tag。
该项目目前也有277个star了,欢迎在业务上试用 jianfengye/collection(https://github.com/jianfengye/collection) 这个包,有问题请直接提issue,我会尽快响应。
collection包1.1.0都升级了什么功能的更多相关文章
- struts2.3.16所需的基本的jar包---------SSH升级包不是整体全部都升级的
struts2.3.16所需的基本的jar包 jar包放多了就报Exception什么Unable to load....上网搜了半天也没有能解决的 下面所说的jar包放到WEB-INF/lib以 ...
- Nuget包CommonServiceLocator从1.0.3升级到2.0.4时MvvmLight的ViewModelLocator初始化SimpleIoc.Default格式不匹配问题
原文:Nuget包CommonServiceLocator从1.0.3升级到2.0.4时MvvmLight的ViewModelLocator初始化SimpleIoc.Default格式不匹配问题 把旧 ...
- rpm包安装的nginx热升级
文章目录一.本地环境基本介绍二.yum升级命令说明三.升级好nginx后如何不中断业务切换3.1.nginx相关的信号说明3.2.在线热升级nginx可执行文件程序一.本地环境基本介绍本次测试环境,是 ...
- rac 10g 10.2.0.1升级到10.2.0.5具体解释
RAC 10.2.0.1 升级到 10.2.0.5 一. 准备: Patch 包:p8202632_10205_LINUX.zip 节点数:3个节点 RAC1 RAC2 ...
- Linux下Oracle 10.2.0.1升级到10.2.0.4总结
最近部署测试环境时,将测试环境ORACLE数据库从10.2.0.1升级到了10.2.0.4,顺便整理记录一下升级过程. 实验环境: 操作系统:Oracle Linux Server release 5 ...
- Oracle数据库版本10.2.0.1升级到10.2.0.3(转)
Oracle数据库版本10.2.0.1升级到10.2.0.3 1.停止OEM/isqlplus/监听/DB实例 $ emctl stop dbconsole $ isqlplusctl stop $ ...
- Oracle11.2.0.1升级到11.2.0.3
Oracle数据库升级也并非简单的事,这篇博客,博主对Oracle那点事做了较详细的介绍: http://blog.itpub.net/9599/viewspace-473003/ 我还属于Oracl ...
- CDH 版本 6.0.1 升级到 6.2.0 当前最新版本(CentOS 7.x)
前文「CDH CM版本 6.0.1 升级到 CM 6.2.0 当前最新版本(CentOS 7.x)」 承接上文,当我们完成 CM 6.2.0 的升级之后,我们已经相当于完成了80% minor 的升级 ...
- windows使用zip包安装mysql8.0.12
1.前言 在windows下有两种安装mysql的方式,一种是msi的方式,一种是使用zip包的安装方式.通常都是用msi的方式,毕竟不需要敲命令,只用图形界面就可以完成安装.zip包的安装方式也很简 ...
随机推荐
- 数据库-SQL语法:LEFT JOIN
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行.(补充:left join是一对多的关系,表里所有符合条件的记 ...
- UNIX 进程间通讯(IPC)概念(Posix,System V IPC)
IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对 ...
- javascipt的forEach
1.Array let arr = [1, 2, 3]; arr.forEach(function (element, index, array) { console.log('数组中每个元素:', ...
- 对Fiddler设置【Decrypt HTTPS traffic】后火狐浏览器打开https【您的连接并不安全】的解决方法
火狐浏览器在打开https页面的时候出现[您的连接并不安全]的提示页面: 在设置Fiddler的HTTPS解密的时候,会对下面图中的红线框的选项点击一次生成一个Fiddler 根证书在桌面上: 点击火 ...
- 【Java_基础】java中的常量池
1.java常量池的介绍 java中的常量池,通常指的是运行时常量池,它是方法区的一部分,一个jvm实例只有一个运行常量池,各线程间共享该运行常量池. java常量池简介:java常量池中保存了一份在 ...
- MySQL中日期函数的使用
1. MySQL中日期函数的使用 1.1. 转DATETIME类型为Date类型 将add_time ::56转化为date类型 select * from product where Date(ad ...
- Git学习——从远程库克隆
克隆一个本地库 首先准备好一个远程库.再用命令克隆一个本地库. git clone git@github.com:<github账户>/<远程库名>.git 克隆一个仓库,首先 ...
- fshc之请求仲裁机制(from mcu and cache)
1.arbiter模块本身放在sclk时钟域,但是输入都是来之HCLK时钟域. 2.当MCU/CACHE访问FSHC时,FSHC不接受其他请求,FSHC只可以同时处理一个请求的操作. 3.如果原子操作 ...
- pandas.DataFrame——pd数据框的简单认识、存csv文件
接着前天的豆瓣书单信息爬取,这一篇文章看一下利用pandas完成对数据的存储. 回想一下我们当时在最后得到了六个列表:img_urls, titles, ratings, authors, detai ...
- The US in understimating Huawei, says founder Ren zhengfei
Huawei Founder Ren Zhengfei has downplayed the impact of the US executive order that cripple Huawei' ...