问题引入:
发现,在构建二叉树时,经常需要自己手动的输入数值,进而去构建。普通二叉树自然是无所谓了,用一个Random类的实例去循环得到就行了。问题就在与,我就是不想让我的二叉树中 的元素的value属性重复。那怎么办?这时,就得找一个 没有重复元素的数组,而且数据还要自动生成的。
初步解决:
/**
* 产生一个固定大小,最大值小于bound的一个Integer[]
* 去除重复。
* @param length 所要的数组的长度
* @param bound 数组中元素的的最大值(max=bound)
* @return
*/
public static Integer[] getIntegerArray(int length, int bound) {
Integer[] arr = new Integer[length];
// 数组中最后一个元素是默认的null,就一直去插入元素。
while (arr[length - 1] == null) {
// 得到一个随机数,范围是(0,bound]
int num = new Random().nextInt(bound) + 1;
insert(arr, num);
}
return arr;
}
/**
* 给数组中插入一个num,如果数组中存在num则不进行插入操作。
* @param arr 指定一个数组
* @param num 数据
*/
private static void insert(Integer[] arr, Integer num) {
for (int i = 0; i < arr.length; i++) {
if(arr[i] == null) {
arr[i] = num;// 保存到数组
break;
}
// 出现重复数据,不保存数据
if(arr[i] == num) {
break;
}
}
}
初步测试:
public static void main(String[] args) {
Integer[] ints = getIntegerArray(10, 30);
System.out.println(Arrays.toString(ints));
}
结果展示:
当传入的参数是(10,30)得到了结果:
[2, 24, 1, 19, 9, 17, 25, 8, 14, 18]
另外:
为了证明我的方法是有效的,我做了好几次测试。
当传入的参数是(30,30)时,得到的是一个从1到30的所有数值,也就是说明了,它去除了重复元素(保证了没有重复元素)。
当传入的参数是(31,30) 时, 不好意思,我的eclipse直接卡死掉 了。这个时候,它 会不停的去创建随机数,尝试去插入到数组中。在1到30都出现过一次之后,再次插入肯定是不行的。