想了两种方法,不知道满不满足楼主想法
- //方法1,使用TreeSet重写compare方法添,就能自动把添加的数字插入到对应位置
- private static int[] fun1(int[] arr, int num) {
- int[] newArr = new int[arr.length + 1];
- //创建TreeSet对象传入比较器
- TreeSet<Integer> ts = new TreeSet<Integer>(new Comparator<Integer>() {
- @Override
- public int compare(Integer i1, Integer i2) {
- int i = i1 - i2;
- return i == 0 ? 1 : i;
- }
- });
- //将原来数字添加的TreeSet对象中
- for (Integer i : arr) {
- ts.add(i);
- }
- //添加新元素到TreeSet对象中
- ts.add(num);
- //将TreeSet元素添加到新的数组中
- int count = 0;
- for (Integer i : ts) {
- newArr[count++] = i;
- }
- return newArr;
- }
- //方法2:使用Arrays的二分查找法找出插入点位置,再来进行复制添加操作
- private static int[] fun2(int[] arr, int num) {
- int[] newArr = new int[arr.length + 1];
- //使用二分查找法查找插入点,如果匹配到数组元素,返回该元素位置i,无法匹配是返回 -插入点-1;
- int i = Arrays.binarySearch(arr, num);
- //分两种情况,匹配到元素和未匹配到元素;
- //简介:使用数组复制System的数组复制方法arraycopy,先复制插入点左边,在添加插入点元素,再复制插入点右边
- //public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
- //src:源数组; srcPos:源数组要复制的起始位置; dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。
- if (i >= 0) {
- System.arraycopy(arr, 0, newArr, 0, i);
- newArr[i] = num;
- System.arraycopy(arr, i, newArr, i + 1, arr.length - i);
- } else {
- System.arraycopy(arr, 0, newArr, 0, -i - 1);
- newArr[-i - 1] = num;
- System.arraycopy(arr, -i - 1, newArr, -i, arr.length + i + 1);
- }
- return newArr;
- }
复制代码 |