数组去重 三种方法 (不用集合)


第一种方法(只学到数组的看):

定义一个新的数组长度和旧数组的长度一样,存储除去重复数据的旧数组的数据和0,

public static void main(String[] args) {
    // 获取一个无重复元素的数组
    int[] arr = new int[] { 11, 22, 22, 33, 44, 55, 44, 66, 66, 66 };
    // 先确定新数组的长度
    int[] newArr = new int[arr.length];

    int index = 0; // 新数组存储元素索引(或者说无重复的个数)

    outer: for (int i = 0; i < arr.length; i++) {
        for (int j = i + 1; j < arr.length; j++) {
                     //当数据重复时,跳出外圈循环
            if (arr[i] == arr[j]) {
                continue outer;
            }
        }
        // 后面没有与当前元素重复的值,保存这个数
        newArr[index] = arr[i];
        index++;
    }
    // 新数组中存储着无重复的值和后面一些无效的0
    int[] result = new int[index];
    for (int i = 0; i < index; i++) { // 遍历有效值个数
        result[i] = newArr[i];
    }
    System.out.println(Arrays.toString(result));
}

第二中方法:

 一个一个删除,有一个删一个. 
 把数组中的一个数据和其他数据进行比较,如果有一个重复时,就直接开始创建新数组把重复的元素去除,并重新赋给旧数组
 1    /*
 2  * 一个一个删除,有一个删一个. 
 3  * 把数组中的一个数据和其他数据进行比较,如果有一个重复时,就直接开始创建新数组把重复的元素去除,并重新赋给旧数组
 4  */
 5 
 6 public static void main(String[] args) {
 7 
 8     int[] arr = { 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 };
 9 
10     for (int i = 0; i < arr.length; i++) {
11 
12         for (int j = i + 1; j < arr.length; j++) {
13 
14             if (arr[i] == arr[j]) {
15                 // return返回的数字的地址而非数组的数值(不懂的华看一下变量的 名 和所代表的数据地址的关系)
16                 arr = aa(arr, j);
17                 // 改变的数组中新数据顶替了覆盖数组的就数据,所以还要重新比较一次
18                 /*
19                  * { 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 }; 下标 0 1 2
20                  * 当下标为1被删除了 ,下标2的数据补上 0 2 这个新元素还没有被比较,所以要再比较一次,所以j--
21                  */
22                 j--;
23             }
24         }
25     }
26 
27     for (int i = 0; i < arr.length; i++) {
28         System.out.println(arr[i]);
29     }
30 
31 }
32 
33 // 需要获得旧数组和重复元素的下标,然后改成新数组并返回出来新数组
34 public static int[] aa(int[] arr, int index) {
35 
36     // 新数组,没发现一个就去除一个.所以长度-1 就行
37     int[] newArr = new int[arr.length - 1];
38     // 因为就数组的下标要去除一个,又不知道那个,所以定义一个变量自增来当新数组的下标
39     int c = 0;
40     for (int i = 0; i < arr.length; i++) {
41         // 判断传进来的那个重复的下标和数组中的下标相等时,下标的元素就不用重新赋给新数组了
42         if (index != i) {
43             newArr[c] = arr[i];
44             c++;
45         }
46     }
47 
48     return newArr;
49 }

第三种方法;

相同的一起删除,当发现相同的元素,先统计重复的个数,然后一起删掉,得到新数组赋给旧数组 
 1 /* 相同的一起删除,当发现相同的元素,先统计重复的个数,然后一起删掉,得到新数组赋给旧数组 */
 2 
 3 public static void main(String[] args) {
 4 
 5     int[] arr = { 8, 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 };
 6 
 7     arr = a2(arr);
 8 
 9     for (int i = 0; i < arr.length; i++) {
10         System.out.println(arr[i]);
11     }
12 }
13 
14 public static int[] a2(int[] arr) {
15 
16     int a = 0;
17 
18     for (int i = 0; i < arr.length - 1; i++) {
19 
20         for (int j = i; j < arr.length - 1; j++) {
21 
22             // 如果有相同的,就统计出相同元素的个数
23             if (arr[i] == arr[j + 1]) {
24                 a += 1;
25             }
26         }
27         if (a != 0) {
28             // return返回的数字的地址而非数组的数值(不懂的华看一下变量的 名 和所代表的数据地址的关系)
29             arr = a1(arr, arr[i], a);
30             // 一个元素个数获得到,统计变量清零,等待回去下一个元素重复的个数
31             a = 0;
32         }
33     }
34     return arr;
35 }
36 
37 // 删除里面重复的元素
38 public static int[] a1(int[] arr, int arr2, int a) {
39     // 因为就数组的下标要去除一个,又不知道那个,所以定义一个变量自增来当新数组的下标
40     int c = 1;
41     // 获得新数组的长度,就是旧数组减去元素重复的次数
42     int[] aa = new int[arr.length - a];
43     // 重复的元素也要保留一个
44     aa[0] = arr2;
45     for (int i = 0; i < arr.length; i++) {
46         // 不与重复元素相同的元素都非给新数组
47         if (arr2 != arr[i]) {
48             aa[c++] = arr[i];
49         }
50     }
51     return aa;
52 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM