我们在日常练习、或实际应用中经常会用到唯一的值来为我们的数据做标记,当体量变得非常大时,就需要对数据做一些处理以达到我们的需求。
本文编写了一份随机生成 n条 m位 不重复的 整数 作为 用户id 工具类 以便大家使用:
随机生成不重复整数源码:
// 随机生成 n 条 长度为 m 不重复的 整数(常用于主键id)
// 参数一:指定生成多少条数据 参数二:指定每一条数据的长度[ 例 m=3 --> 678 ]
public static ArrayList<Long> uniqueId(Integer n, Integer m) {
// 使用ArrayList集合的原因:便于使用索引操作结果集
ArrayList<Long> check = new ArrayList<>(n);
while (true) {
if (check.size() == n) {
break; // 当集合长度达到指定长度时,打破循环
}
String id_string = ""; // 预定义字符串准备拼接
for (int j = 0; j < m; j++) {
if (j == 0) {
// 保证第一位不为0
id_string += (long) (Math.random() * 9 + 1) + "";
} else {
// 随机生成0~9 、拼接
id_string += (long) (Math.random() * 10) + "";
}
}
long uid = Long.parseLong(id_string); // 转为long类型,int类型可能会超出最大值异常
boolean flag = true; // 定义一面旗帜做为检验是否重复值标记
for (Long c : check) {
if (c == uid) { // 遍历判断,若有重复值,则flag=false,并打破循环
flag = false;
break;
}
}
if (flag) { // 若flag为true,则证明没有重复值
check.add(uid); // 将uid加入集合
}
}
return check; // 返回生成的集合
}
有朋友可能会问:为什么不利用 set集合 的特性而做这么多判断将数据存于 ArrayList集合 中呢?
原因是将数据存在 ArrayList集合 中我们便于 根据 索引 取值:
测试效果如图:
随机生成不重复字符串源码:
// 随机生成 n 条 长度为 m 不重复的 整数(常用于主键id)
// 参数一:指定生成多少条数据 参数二:指定每一条数据的长度[ 例 m=3 --> 678 ] 参数三:默认拼接在头部,可根据需求修改源码
public static ArrayList<String> uniqueStringId(Integer n, Integer m, String str) {
// 使用ArrayList集合的原因:便于使用索引操作结果集
ArrayList<String> check = new ArrayList<>(n);
while (true) {
if (check.size() == n) {
break; // 当集合长度达到指定长度时,打破循环
}
String id_string = str; // 预定义字符串准备拼接
for (int j = 0; j < m; j++) {
// 随机生成0~9 、拼接
id_string += (long) (Math.random() * 10) + "";
}
boolean flag = true; // 定义一面旗帜做为检验是否重复值标记
for (String c : check) {
if (c.equals(id_string)) { // 遍历判断,若有重复值,则flag=false,并打破循环
flag = false;
break;
}
}
if (flag) { // 若flag为true,则证明没有重复值
check.add(id_string); // 将uid加入集合
}
}
return check; // 返回生成的集合
}
测试效果图:
对随机数不太熟悉的朋友请参考:Math.random()随机数 使用详解【一看就懂】_杨大仙爱篮球-CSDN博客_java随机数math.random怎么用
搭配使用场景:
JAVA高效率 (秒级) 将千万条数据导入数据库 (已封装工具类)【详解】【一看就懂】_杨大仙爱篮球-CSDN博客
如有错误,欢迎指正
Thanks