上一篇我们说了,等额切割List
等额拆分List
这次我们说一下如何随机获取一个list中数据,大小可变,位置随机。
上代码:
package com.example.demo1.util;
import java.util.*;
/**
* @desc 随机获取List数据
* @date 2020-05-25
*/
public class SplitArrayUtils {
/**
* 随机获取长度为size的list<br>
* 获取的list顺序也是随机的
* 截取size比list长或相等,则返回全部
* @param source
* @param size
* @return
*/
public static <T> List<T> getRandomList(List<T> source, int size){
if(source.size() <= size){
Collections.shuffle(source);
return source;
}
List<T> target = new ArrayList<>(size);
Set<Integer> set = new HashSet<>(size);
while (set.size() < size){
int random = new Random().nextInt(source.size());
if(!set.contains(random)){
set.add(random);
target.add(source.get(random));
}
}
return target;
}
}
主要就是利用随机数,获取源list位置的数据,不断地对新list数据进行新增,直至达到长度。
如果获取长度大于源list长度,可以使用Collections.shuffle()
接口方法进行数据获取。
看下结果:
/**
* create by c-pown 2020-05-25
*/
public class TestArrays {
public static void main(String[] args) {
Student student = null;
List<Student> studentList = new ArrayList<>();
//添加十五个学生元素
for (int i = 0; i < 15; i++) {
student = new Student("name"+i,20,183,"玩");
studentList.add(student);
}
//获取随机大小元素数组
List<Student> lists1 = SplitArrayUtils.getRandomList(studentList,15);
lists1.stream().forEach(System.out::println);
}
}
Student{name='name2', age=20, heigh=183, hoby='玩'}
Student{name='name6', age=20, heigh=183, hoby='玩'}
Student{name='name12', age=20, heigh=183, hoby='玩'}
Student{name='name9', age=20, heigh=183, hoby='玩'}
Student{name='name1', age=20, heigh=183, hoby='玩'}
Student{name='name8', age=20, heigh=183, hoby='玩'}
Student{name='name0', age=20, heigh=183, hoby='玩'}
Student{name='name10', age=20, heigh=183, hoby='玩'}
Student{name='name3', age=20, heigh=183, hoby='玩'}
Student{name='name14', age=20, heigh=183, hoby='玩'}
可以看到结果却是我们想要的。