JAVA从当前List中有规律的取出N条数据

最近有个需求,是从给出一个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:

如有好的想法,欢迎评论,互相学习下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值