前言:以下两种方法都适用于不同类型的数组,包括 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 newList = new ArrayList();
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
SethashSet = 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
小提示:此随机去重算法和数组类型无关,可应用于不同类型数组(包括实体类对象数组哟),得到随机不重复数组!
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)