前言:以下两种方法都适用于不同类型的数组,包括 int 类型数组、String 类型数组以及对象数组等,以下以数值类型数组为例。
需求:随机在一个数组中取一定数目(小于数组长度)的元素组成一个新数组,要求新数组里的元素不重复!
方法一:原数组长度每次会减1,对于不含有相同数字的 int类型数组,能达到随机不重复取值,但是对于含有相同数字的nt类型数组,就不能保证每次取值都是不重复的,具体代码和效果图如下:
public static void main(String[] args) {
//定义的包含相同元素的 int类型数组
int[] oldArray = {1, 3, 9, 6, 7, 5, 8, 6, 6, 7, 6};
List<Integer> newList = new ArrayList<Integer>();
System.out.println(JSONArray.toJSONString(oldArray));
//当前新数组长度小于5就进入循环
while(newList.size() < 5) {
//Math.random()返回的类型是Number,可返回介于 0(包含) ~ 1(不包含) 之间的一个随机数
//此处拿到整型,需进行转义
int i=(int)(Math.random()*oldArray.length);
System.out.println("随机数:"+i+"数组值:"+oldArray[i]);
newList.add(oldArray[i]);
oldArray[i] = oldArray[oldArray.length-1];
//此步每次原数组长度会减少1,为的是达到去重效果
oldArray = Arrays.copyOf(oldArray, oldArray.length-1);
}
System.out.println("新数组"+JSONArray.toJSONString(newList));
System.out.println("旧数组"+JSONArray.toJSONString(oldArray));
}
法一总结:对于包含相同元素的数值类型数组,不能每次达到随机不重复的组合要求,但对于不包含相同元素的数值类型数组,是可以达到的,读者可以亲自尝试下!
方法二:采用hashSet.add()方法,即使对于包含相同元素的数值类型数组,存放也只是不重复的元素,该方法声明只有当元素尚未存在于集合中时才会添加元素。如果成功添加了元素,则该方法返回true,否则返回false,具体代码和效果图如下:
public static void main(String[] args) {
//定义的包含相同元素的 int类型数组
int[] intArray = {1, 3, 9, 6, 7, 5, 8, 6, 6, 7, 6};
//转化json格式便于控制台打印
System.out.println(JSONArray.toJSONString(intArray));
//定义HashSet
Set<Integer> hashSet = new HashSet<>();
//当前hashSet的长度小于5即进入循环
while (hashSet.size() < 5) {
//Math.random()返回的类型是Number,可返回介于 0(包含)~ 1(不包含)之间的一个随机数
//此处拿到整型,需进行转义
int index = (int) (Math.random() * intArray.length);
//判断元素存不存在hashSet
if(!hashSet.contains(intArray[index])) {
//往hashSet里添加先前不存在的元素
//此处申明以下,不要外面的if判断语句也是可以达到目的的
hashSet.add(intArray[index]);
}
}
System.out.println("新数组"+hashSet);
System.out.println("旧数组"+JSONArray.toJSONString(intArray));
}
法二总结:此方法不论给出数组是没有重复元素还是有重复元素的,得到都是随机不重复的集合,且原数组结构不会被破坏;转数值集合方式为List<Integer> newList = new ArrayList<Integer>(hashSet)
小提示:此随机去重算法和数组类型无关,可应用于不同类型数组(包括实体类对象数组哟),得到随机不重复数组!