java按时间范围过滤_一个简单的Java集合范围过滤的多个方式对比

在一个项目里面有这么一个技术需求:

1.集合中元素个数,10M

2.根据上限和下限从一个Set中过滤出满足要求的元素集合.

实际这个是个很典型的技术要求, 之前的项目也遇见过,但是因为当时的类库不多, 都是直接手写实现的. 方式基本等同于第一个方式.

在这个过程中, 我写了四个方式, 基本记录到下面.

第一个方式:对Set进行迭代器遍历, 判断每个元素是否都在上限和下限范围中.如果满足则添加到结果集合中, 最后返回结果集合.

测试效果:集合大小100K, 运算时间 3000ms+

过滤部分的逻辑如下:

1     void filerSet(Set targetSet, String lower, String higher) {

2         BigDecimal bdLower = new BigDecimal(Double.parseDouble(lower));

3         BigDecimal bdHigher = new BigDecimal(Double.parseDouble(higher));

4

5         Set returnSet = new HashSet();

6         for (BigDecimal object : targetSet) {

7             if (isInRange(object, bdLower, bdHigher)) {

8                 returnSet.add(object);

9             }

10         }

11     }

12

13     private boolean isInRange(BigDecimal object, BigDecimal bdLower,

14             BigDecimal bdHigher) {

15         return object.compareTo(bdLower) >= 0

16                 && object.compareTo(bdHigher) <= 0;

17     }

第二个方式: 借助TreeSet, 原始集合进行排序, 然后直接subset.

测试效果: 集合大小10M, 运算时间: 12000ms+(获得TreeSet) , 200ms(获得结果)

过滤部分的逻辑如下(非常繁琐):

1     Set getSubSet(TreeSet targetSet, String lower,

2             String higher) {

3

4         BigDecimal bdLower = new BigDecimal(Double.parseDouble(lower));

5         BigDecimal bdHigher = new BigDecimal(Double.parseDouble(higher));

6

7         if ((bdHigher.compareTo(targetSet.first()) == -1)

8                 || (bdLower.compareTo(targetSet.last()) == 1)) {

9             return null;

10         }

11

12         boolean hasLower = targetSet.contains(bdLower);

13         boolean hasHigher = targetSet.contains(bdHigher);

14         if (hasLower) {

15             if (hasHigher) {

16                 System.out.println("get start:" + bdLower);

17                 System.out.println("ge

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值