使用列表刪除的方式處理百萬級陣列的資料
阿新 • • 發佈:2019-01-07
看到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);
}
}