最近有个需求,是从给出一个List<Object> 数组, 要求取出N条数据(要有规律的取出),下边上代码。
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
//得筛选的list
List<Object> list = new ArrayList<>();
int listSize = 80;
//填充测数据
for (int i = 1; i <= listSize; i++) {
list.add(i);
}
System.out.println("取出前===="+list.size());
System.out.println("取出前===="+list);
//要取出的数量
int num = 9;
List<Object> waitList = getList1(list, num);
System.out.println("取出后===="+waitList.size());
System.out.println("取出后===="+waitList);
}
/**
* 根据计算有规律的从list中取出,相应的数量的数据
* list 需要筛选的list
* num 取出的个数
* **/
private static List<Object> getList1(List<Object> list, int num) {
int listSize = list.size();
if (listSize <= num) {
return list;
}
List<Object> waitList = new ArrayList<Object>();
BigDecimal bigDecimal = new BigDecimal(listSize);
BigDecimal bigDecimal1 = new BigDecimal(num);
BigDecimal bigDecimal2 = bigDecimal.divide(bigDecimal1,3,BigDecimal.ROUND_HALF_UP);
for (int i = 0; i < num; i++) {
BigDecimal index = bigDecimal2.multiply(new BigDecimal(i));
int result = (int) Math.floor(index.doubleValue());
waitList.add(list.get(result));
}
return waitList;
}
/**
* 根据取出的数量 随机生成一组指定范围内不重复的下标,再去取
* list 需要筛选的list
* num 取出的个数
* **/
private static List<Object> getList2(List<Object> list, int num){
int listSize = list.size();
//如果要取出的个数大于当前list的size;则返回当前list
if(listSize <= num) { return list; }
//待返回的list
List<Object> waitList = new ArrayList<Object>();
//随机生成要取出的下标
SortedSet<Integer> sortedSet = new TreeSet<Integer>();
randomSet(0, listSize, num, sortedSet);
System.out.println("sortedSet数集合====="+sortedSet);
for (Integer i : sortedSet) {
waitList.add(list.get(i));
}
return waitList;
}
/**
* 随机生成一组数
* m 指定范围最小值
* n 指定范围最大值
* num 生成的数量(个)
* set 数组集合
* **/
public static void randomSet(int m, int n, int num, SortedSet<Integer> set) {
set.add(m + (int) (Math.random() * (n - m)));
if (set.size() < num) {
randomSet(m, n, num, set);
}
}
}
测试1:
测试2:
如有好的想法,欢迎评论,互相学习下