想获取一个链表(List)的子集,可以直接使用subList方法,但是集合(Set)并没有类似的subSet的方法。

有些应用场景需要获取一个集合的子集,这时候该怎么做呢?

最容易想到的方式,就是构造一个新的集合,将集合的元素拷贝过去:

public Set<Object> subSet(Set<Object> objSet, int size) {if (CollectionUtils.isEmpty(objSet)) {return Collections.emptySet();}int realSize = objSet.size() < size ? objSet.size() : size;Set<Object> objSubSet = Sets.newLinkedHashSetWithExpectedSize(realSize);Iterator<Object> iterator = objSet.iterator();for (int i = 0; i < realSize; i++) {objSubSet.add(iterator.next());}return objSubSet;
}

我们也可以换个角度思考,既然链表是有获取子集的方法的,可以转换一下通过链表来获取:

public Set<Object> subSet(Set<Object> objSet, int size) {if (CollectionUtils.isEmpty(objSet)) {return Collections.emptySet();}List<Object> objList = Lists.newArrayList(objSet);return Sets.newLinkedHashSet(objList.subList(0, size));
}

但是当集合较大,截取的集合也较大时,这种方式的效率并不高,并且内存占用也比较多(数据拷贝)。

那么有没有什么更好的方法呢?答案是有的。

如果使用的集合实现了SortedSet接口,可以直接使用subSet方法。

但有时候排序规则并不是想要的,比如希望按照插入的顺序获取前xx个等。

Google的Guava很有名,但它的Sets、Collections2中并没有获取集合子集的方法,通过查阅资料,发现在另外的类中,实现也很便捷:

public Set<Object> subSet(Set<Object> objSet, int size) {if (CollectionUtils.isEmpty(objSet)) {return Collections.emptySet();}return ImmutableSet.copyOf(Iterables.limit(objSet, size));
}

通过这个方法获取的是懒加载的集合镜像,节约了时间和空间,推荐使用(但并非所有场景都适用,不适用的场景外层可以再套一个new LinkedHashSet以消除懒加载和镜像的影响)。

参考资料:Creating subset of a Set in Java

java中获取一个集合(Set)的子集的方法相关推荐

  1. java List最大_在java中获取List集合中最大的日期时间操作

    取list集合中最大的日期, 可以用date max = collections.max(datelist);, 传入一个日期集合, 就可以获取, 工作中有这个需求, 就查找到这个, 代码如下 } e ...

  2. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  3. Java中常见的集合框架及常用的方法

    本篇文章主要说明Java中一些常见的集合框架及经常用到的一些方法 , 由于都是一些父类 , 所以没有做太深入的分析说明 , 后面的文章将会分别对List , Set , Map及其常用子类进行深入研究 ...

  4. Java中的ArrayList集合定义、遍历、方法

    /* 一.定义 ArrayList集合的使用 是引用数据类型 实用的步骤: 1.导入包 java.util包中 2.创建引用类型的变量 数据类型<集合储存的数据类型> 变量名 = new ...

  5. java中获取文件夹路径,java中获取文件或文件夹的路径方法

    获取当前类的所在工程路径; 如果不加"/" File f = new File(this.getClass().getResource("").getPath( ...

  6. Java中对List集合排序的两种方法

    第一种方法,就是list中对象实现Comparable接口,代码如下: public class Person implements Comparable<Person> {private ...

  7. Java中获取GBK编码汉字的拼音首字母(包括生僻字)

    Java中获取GBK编码汉字的拼音首字母(包括生僻字) 前言 代码 结果 前言 网上关于Java中获取汉字的拼音首字母的方法很多,但大多基于GB2312的汉字所属编码位置判断方法,现有一种基于GBK编 ...

  8. java如何实例化集合_如何在java中实例化一个Queue对象?

    Queue是一个接口,这意味着你不能直接构造一个Queue . 最好的select是构造一个已经实现Queue接口的类,如下所示: AbstractQueue , ArrayBlockingQueue ...

  9. JAVA中的Map集合

    JAVA中的Map集合 1.Map简介 java.util.map接口 1.Map称为查找表,该数据结构的样子是一个"多行两列"的表格,左列为key,右列为value,Map总是根 ...

最新文章

  1. 1035 Password
  2. 世界首批智能音箱AI IQ测试报告,小米、京东和阿里初步PK
  3. Nature子刊:视网膜计算使眼睛先于大脑产生视觉信息
  4. 【书评】RHCSA/RHCE Red Hat Linux 认证学习指南(第6版)EX200 EX300
  5. vmbox下linux共享文件
  6. Nginx FastCGI的运行原理
  7. oh-my-zsh 国内网络快速安装方法 | How to install oh-my-zsh in China
  8. 面型对象 (接口与类的区别)
  9. 前端学习(1678):前端系列实战课程之声明和创建游戏地图
  10. 【数据结构与算法】字符串匹配 KMP 算法
  11. jmeter mysql查询结果提取_Jmeter-从数据库中获取数据并作为变量使用
  12. Java案例:Java版生命游戏
  13. [转载]各种在线api地址
  14. 我觉得我应该养成经常翻收藏夹的习惯
  15. Vue Cli 3 搭建一个可按需引入组件的组件库架子
  16. 大学生创新创业训练计划项目申请书
  17. 基于UDP的网络群聊系统
  18. 3DMAX渲染慢?一些小方法提升3DMAX渲染速度~
  19. Java base64转inputStream
  20. 论文学习——多元时间序列相似性度量方法

热门文章

  1. Arduino 播放音乐教程
  2. linux下的计划任务
  3. 《C语言入门》简单回文序列问题求解
  4. 适合python的vim设置
  5. 前端web:响应式Web开发优缺点总结
  6. 音视频开发之旅(34) - 基于FFmpeg实现简单的视频解码器
  7. AutoLayout的使用
  8. Android中 .stub类的使用
  9. 虚拟主机怎么搭建网站(如何搭建自己虚拟主机)
  10. Enhancing Adversarial Training with Second-Order Statistics of Weights