使用列表删除的方式处理百万级数组的数据

1 篇文章 0 订阅

看到csdn问答中有人问了一个问题,,百万级的Integer数组,进行分批删除,每次删除一定数量的数据,就顺手写了个小程序,,熟读还是ms级的,但是一般情况下应该不会给你一大串数据让你获取处理的,,毕竟数据量大处理的时间也会相应的延长……

package com.myk.utils.test;

import java.time.Clock;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArrayUtils {
    public static void main(String[] args) {
        int arraySize = 1000000;
        int splitSize = 1000;
        Integer[] ids = new Integer[arraySize];
        long time1 = Clock.systemUTC().millis();
        for(int i = 0 ; i < arraySize ; i++) {
            ids[i] = i;
        }
        batchRemoveArray(ids, splitSize);
        long time2 = Clock.systemUTC().millis();
        System.err.println("程序运行时间:"+(time2-time1));//程序运行时间在 15ms 左右
    }

    /**
     * 批量移除数组数据
     * @param integerArray:需要操作的数组
     * @param removeSize:一次移除多少
     */
    private static void batchRemoveArray(Integer[] integerArray, int removeSize) {
        List<Integer> idsList = new ArrayList<>(Arrays.asList(integerArray));//将数组转换为list列表

        //分块
        int listSize = idsList.size();

        int forSize = listSize/removeSize;//至少要循环几次
        int forSizeClind = listSize%removeSize;//剩下的长度(不为0,则说明还有值,多加一次循环)

        int xunhuancishu = forSize;
        if(forSizeClind != 0) {//判断应该循环多少次
            xunhuancishu += 1;
        }

        int currentSize = 0;
        //时间复杂度O(xunhuancishu)
        //平均运行时间为 1ms 左右
        long time4 = Clock.systemUTC().millis();
//      idsList.clear();//使用这个清除比批量删除还要慢些
        for(int i = 0 ; i < xunhuancishu ; i++) {
            if(i < forSize) {
                idsList = idsList.subList(removeSize, listSize - currentSize);
                currentSize += removeSize;
            }else {
                idsList = idsList.subList(forSizeClind, forSizeClind+1);//只要进来这里说明已经结束了
            }
//          System.out.println(idsList.size());//打印耗时在 10ms 左右
        }
        long time5 = Clock.systemUTC().millis();
        System.err.println(time5 - time4);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值