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


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

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

    package demo01;
    
    import java.sql.Array;
    import java.util.Arrays;
    /*JAVA数组去重**/
    public class ArrayQC {
        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]) {
                        //System.out.println("arr[i]:"+arr[i]+"arr[j]:"+arr[j]);
                        continue outer;
                    }
                }
                // 后面没有与当前元素重复的值,保存这个数
                //System.out.println("for内的index:"+index);
                newArr[index] = arr[i];
                index++;
            }
            // 新数组中存储着无重复的值和后面一些无效的0
            //System.out.println("index:"+index);
            int[] result = new int[index];
            for (int i = 0; i < index; i++) { // 遍历有效值个数
                result[i] = newArr[i];
            }
            System.out.println(Arrays.toString(result));
        }
    
    }

    第二中方法:

     /* 第二种方法:
         * 
         * 一个一个删除,有一个删一个. 
         * 把数组中的一个数据和其他数据进行比较,如果有一个重复时,就直接开始创建新数组把重复的元素去除,并重新赋给旧数组
         */
    
    public static void main(String[] args) {
    
        int[] arr = { 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 }; // 1, 5, 3, 4, 8
    
        for (int i = 0; i < arr.length; i++) {
    
            for (int j = i + 1; j < arr.length; j++) {
    
                if (arr[i] == arr[j]) {
                    //System.out.println("arr[i]:"+arr[i]+",arr[j]"+arr[j]);
                    // return返回的数字的地址而非数组的数值(不懂的华看一下变量的 名 和所代表的数据地址的关系)
                    arr = aa(arr, j);
                    // 改变的数组中新数据顶替了覆盖数组的就数据,所以还要重新比较一次
                    
                     // { 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 }; 下标 0 1 2
                     // 当下标为1被删除了 ,下标2的数据补上 0 2 这个新元素还没有被比较,所以要再比较一次,所以j--
                    //System.out.println("j:"+j); 
                    j--;
                }
            }
        }
    
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    
    }
    
    // 需要获得旧数组和重复元素的下标,然后改成新数组并返回出来新数组
    public static int[] aa(int[] arr, int index) {
    
        // 新数组,每发现一个就去除一个.所以长度-1 就行
        int[] newArr = new int[arr.length - 1];
        // 因为就数组的下标要去除一个,又不知道那个,所以定义一个变量自增来当新数组的下标
        int c = 0;
        for (int i = 0; i < arr.length; i++) {
            // 判断传进来的那个重复的下标和数组中的下标相等时,下标的元素就不用重新赋给新数组了
            if (index != i) {
                newArr[c] = arr[i];
                c++;
            }
        }
    //System.out.println("newArr:"+newArr.toString());
        //bl(newArr);
        return newArr;
    }
    
    //遍历数组
    //public static void bl(int[] arr){
    //    for(int i = 0 ; i < arr.length ; i++){
    //        System.out.print(arr[i]+ ",    ");
    //    }
    //}

    第三种方法;

        /**第三种方法:
         * 
         *  相同的一起删除,当发现相同的元素,先统计重复的个数,然后一起删掉,得到新数组赋给旧数组 */
    
        public static void main(String[] args) {
    
            int[] arr = { 8, 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 };
    
            arr = a2(arr);
    
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    
        public static int[] a2(int[] arr) {
    
            int a = 0;
    
            for (int i = 0; i < arr.length - 1; i++) {
    
                for (int j = i; j < arr.length - 1; j++) {
    
                    // 如果有相同的,就统计出相同元素的个数
                    if (arr[i] == arr[j + 1]) {
                        a += 1;
                    }
                }
                if (a != 0) {
                    // return返回的数字的地址而非数组的数值(不懂的华看一下变量的 名 和所代表的数据地址的关系)
                    arr = a1(arr, arr[i], a);
                    // 一个元素个数获得到,统计变量清零,等待回去下一个元素重复的个数
                    a = 0;
                }
            }
            System.out.print("方法a2:");
            bl(arr);
            return arr;
        }
    
        // 删除里面重复的元素
        public static int[] a1(int[] arr, int arr2, int a) {
            // 因为就数组的下标要去除一个,又不知道那个,所以定义一个变量自增来当新数组的下标
            int c = 1;
            // 获得新数组的长度,就是旧数组减去元素重复的次数
            int[] aa = new int[arr.length - a];
            // 重复的元素也要保留一个
            aa[0] = arr2;
            for (int i = 0; i < arr.length; i++) {
                // 不与重复元素相同的元素都非给新数组
                if (arr2 != arr[i]) {
                    aa[c++] = arr[i];
                }
            }
            System.out.print("方法a1:");
            bl(aa);
            return aa;
        }
    
        //遍历数组
        public static void bl(int[] arr){
            for(int i = 0 ; i < arr.length ; i++){
                System.out.print(arr[i] + ",    ");
            }
            System.out.println("数组遍历完毕。");
        }    

    参考文档: https://blog.csdn.net/binLi_Cheng/article/details/81383197

  • 相关阅读:
    JS之函数声明与表达式
    任重道远!
    Java_Notes01
    Android_Application Fundamentals
    Android_Activity
    Android
    Linux下的实模式和保护模式
    spring注解原理
    开启aix SFTP日志 是否和链接SFTP有关呢
    Apache版本兼容性问题
  • 原文地址:https://www.cnblogs.com/william-dai/p/10923189.html
Copyright © 2020-2023  润新知