Java测试List<Object>根据其某个属性去重俩种方法效率

12 篇文章 0 订阅

需要用到根据gpsTime double类型对List进行去重;
尝试了俩种办法,就像知道耗时与性能;

1. 法一:


// 根据gpsTime去重
imagePostList = imagePostList.stream().collect(
     collectingAndThen(
             toCollection(() -> new TreeSet<>(comparing(n -> n.getGpsTime()))), ArrayList::new));

2. 法二:

// List遍历的同时删除元素需要用Iterator迭代元素,否则会报错
Set<Double> gpsTimeSet = new HashSet<>();
// 删除重复的元素
Iterator<ImagePost> iterator = imagePostList.iterator();
while (iterator.hasNext()) {
    ImagePost imagePost = iterator.next();
    if (gpsTimeSet.contains(imagePost.getGpsTime())) {
        log.error("duplicate: id: {}, name: {}, gpsTime: {}", imagePost.getId(), imagePost.getName(), imagePost.getGpsTime());
        iterator.remove();
    } else {
        gpsTimeSet.add(imagePost.getGpsTime());
    }
}

3. 结果

在这里插入图片描述少量数据发现是 Iterator遍历删除效率更高

那么数据量很大的情况下呢?
在这里插入图片描述
很明显,数据量大的时候,还是用Iterator迭代的同时删除重复元素效率更高一些;
多次运行,效果一致,仍然是Iterator更高效

4. 源代码

import java.util.*;

import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;

/*************************************
 * Class Name: TestRemoveDuplicateGpsTime
 * Description:〈测试去重gpsTime效率〉
 * @create 2020/10/16
 * @since 1.0.0
 ************************************/
public class TestRemoveDuplicateGpsTime {

    public static void main(String[] args) {
        TestRemoveDuplicateGpsTime test = new TestRemoveDuplicateGpsTime();
        test.testEfficency();
    }

    public void testEfficency() {
        List<ImagePost> imagePostList = new ArrayList<>();
        initImagePost(imagePostList);
        long time1 = System.currentTimeMillis();
        // 根据gpsTime去重
        imagePostList = imagePostList.stream().collect(
                collectingAndThen(
                        toCollection(() -> new TreeSet<>(comparing(n -> n.getGpsTime()))), ArrayList::new));
        long time2 = System.currentTimeMillis();
        System.out.println("当前程序耗时:" + (time2 - time1) + "ms");
        System.out.println("after GpsTime去重size: " + imagePostList.size());

        System.out.println("-----------------------------------------------");
        imagePostList.clear();
        initImagePost(imagePostList);
        time1 = System.currentTimeMillis();
        removeDuplicate(imagePostList);
        time2 = System.currentTimeMillis();
        System.out.println("当前程序耗时:" + (time2 - time1) + "ms");
    }

    public void removeDuplicate(List<ImagePost> imagePostList) {
        Set<Double> gpsTimeSet = new HashSet<>();
        // 删除重复的元素
        Iterator<ImagePost> iterator = imagePostList.iterator();
        while (iterator.hasNext()) {
            ImagePost imagePost = iterator.next();
            if (gpsTimeSet.contains(imagePost.getGpsTime())) {
                System.out.println("duplicate: id: " + imagePost.getId() + ",gpsTime: " + imagePost.getGpsTime());
                iterator.remove();
            } else {
                gpsTimeSet.add(imagePost.getGpsTime());
            }
        }
        System.out.println("after removeDuplicate, count: " + imagePostList.size());
    }

    public void initImagePost(List<ImagePost> imagePostList) {
        imagePostList.add(new ImagePost(1, 11472.15475));
        imagePostList.add(new ImagePost(2, 11476.1));
        imagePostList.add(new ImagePost(3, 11475.2));
        imagePostList.add(new ImagePost(4, 11332.1));
        imagePostList.add(new ImagePost(5, 11433.5));
        imagePostList.add(new ImagePost(6, 11472.15475));
        imagePostList.add(new ImagePost(7, 11476.1));
        imagePostList.add(new ImagePost(8, 11987.32));
    }

    class ImagePost {
        Integer id;
        double gpsTime;

        public ImagePost(Integer id, double gpsTime) {
            this.id = id;
            this.gpsTime = gpsTime;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public double getGpsTime() {
            return gpsTime;
        }

        public void setGpsTime(double gpsTime) {
            this.gpsTime = gpsTime;
        }
    }
}

参考:

-https://www.cnblogs.com/qq1141100952com/p/11197120.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值