两种方法:一个数组随机取一定数量但不重复的元素组成新数组

前言:以下两种方法都适用于不同类型的数组,包括 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)

小提示:此随机去重算法和数组类型无关,可应用于不同类型数组(包括实体类对象数组哟),得到随机不重复数组!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值