ArraysUtil

数组的排序、增删改查、自写方法

1.Jdk内置方法进行排序,Arrays.sort(....)方法
public class ArrayDemo3 {
    public static void main(String[] args) {
        Integer[] intArr = {2, 7, 3, 3, 2, 4};
        String[] strArr = {"B", "c", "A", "D"};
        String[] numberArr = {"13", "2", "25", "8", "11"};

        //\u4f60\u6211\u4ed6\u5b83
        String[] wordArr = {"你", "我", "他", "它"};
        //JDK内置的数组排序方法
        //从小到大排序(默认)
        //默认按照字典顺序(0(48)-9,A(65)-Z,a(97)-z)
        /*Arrays.sort(intArr);
        Arrays.sort(strArr);
        Arrays.sort(numberArr);
        Arrays.sort(wordArr);*/

        //从大到小排序
        //注意: 基本类型需要提升为包装类才可以使用,即int->Integer,char->Character,其他都是首字母大写
        Arrays.sort(intArr, Collections.reverseOrder());
        Arrays.sort(strArr, Collections.reverseOrder());
        Arrays.sort(numberArr, Collections.reverseOrder());
        Arrays.sort(wordArr, Collections.reverseOrder());

        //打印结果
        System.out.println(Arrays.toString(intArr));
        System.out.println(Arrays.toString(strArr));
        System.out.println(Arrays.toString(numberArr));
        System.out.println(Arrays.toString(wordArr));
    }
}
2.数据元素增删
public class Aarraydemo02 {
    public static void main(String[] args) {
    //数组元素的增删,是通过创建新数组容器,然后拷贝原数组数据到新数组中来间接实现
    //1.自己写代码实现,参见ArrayUtil类
    //2.jdk内置功能,如下
    //jdk方法一
        /**
         * System.arraycopy(Object,src,srcPos,dest,destPos,length)
         * src   原数组
         * srcPos 拷贝元素所在元素组的起始下标
         * dest  目标数组
         * destPos 元素复制到目标数组的下标
         * length 拷贝一次一共复制多少元素
         */
       //例如在数组1,2,3中2和3之间添加为8
       //创建一个新数组,长度为原始组长度的+1
        int[] arr={1,2,3};
        int[] newArr=new int[arr.length+1];
        //把1,2复制到新数组的前两个位置
        System.arraycopy(arr,0,newArr,0,2);
        //把3复制到新数组的最后一个位置
        System.arraycopy(arr,2,newArr,3,1);
        //把添加的元素赋值
        newArr[2]=8;
        System.out.println(Arrays.toString(newArr));
        System.out.println("--------------------------------------");
        //例如在数组1,2,3删除3
        //创建一个新数组,长度为原始组长度的-1
        int[] arr1={1,2,3};
        int[] newArr1=new int[arr.length-1];
        //把1,2复制到新数组的0,1位置
        System.arraycopy(arr1,0,newArr1,0,2);
        System.out.println(Arrays.toString(newArr1));
        System.out.println("------------------------------------");
   //jdk方法2
        /**
         * jdk1.6的数组拷贝
         * Arrays.copyOf();
         * 此方法适合在尾部扩容添加元素/减容删除使用,不像System.arraycopy灵活可以在任何位置。
         */
        int[] arr3={1,2,3};
        int[] newArr3=Arrays.copyOf(arr3,10);
        System.out.println(Arrays.toString(newArr3));
    }
}
3.自己通过算法实现,冒泡,选择,快速,插入.......
package com.JavaSE.util;

import java.util.Arrays;

/**
 * description:数组工具类(默认都是int[]数组)
 *
 * @author Administrator
 * @date 2022/3/10 16:08
 */
public class ArrUtil {

    /**
     * 获取数组中的最大值
     */
    public static int maxElement(int[] arr) {
        /**
         * 关于方法的参数,一般都需要进行两种不同的判断:
         * 1.非空判断,即判断是否为null,避免空指针异常: java.lang.NullPointerException(基本类型不需要判断非空)
         * 2.参数有效性判断,即参数是否符合业务逻辑
         */
        //假设第一个元素是最大的
        int max = arr[0];
        //循环从第二个元素开始依次和max比较
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                //覆盖max
                max = arr[i];
            }
        }
        return max;
    }

    /**
     * 获取数组中的最小值
     */
    public static int minElement(int[] arr) {
        int min = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        return min;
    }

    /**
     * 添加数组元素
     *
     * @param arr        原数组
     * @param pos        添加元素的下标位置
     * @param newElement 添加的元素
     * @return 添加元素后的新数组
     */
    public static int[] addElement(int[] arr, int pos, int newElement) {
        //判断数组是否为空
        if (arr == null) {
            System.out.println("数组参数不能为空!");
            return null;
        }
        //参数有效性判断
        if (pos < 0 || pos > arr.length) {
            //说明添加的下标不在合理范围之内,就返回原数组
            System.out.println("添加元素的下标位置不合法!");
            return arr;
        }
        //创建新数组,长度+1
        int[] newArr = new int[arr.length + 1];
        /**相比于自己写的方法,此方法的思路:分段法
         .先假设已经插入那么先把插入点之前的元素输出
         2.再将插入点的数输出
         3.插入点之后的数输出
         此时也包括了两种特殊情况,pos==0或者pos==arr.length都是可以正常输出的
         */
        //分段法
        //插入点之前
        for (int i = 0; i < pos; i++) {
            newArr[i] = arr[i];
        }
        //插入点
        newArr[pos] = newElement;
        //插入点之后
        for (int i = pos; i < arr.length; i++) {
            newArr[i + 1] = arr[i];
        }
        return newArr;
    }

    /**
     * 根据下标删除数组中的元素(0,1个)
     *
     * @param arr   原数组
     * @param index 被删除元素所在的下标
     * @return 删除元素后的新数组
     */
    public static int[] deleteElementByIndex(int[] arr, int index) {
        //判断数组是否为空
        if (arr == null) {
            System.out.println("数组参数不能为空!");
            return null;
        }
        //参数有效性判断
        if (index < 0 || index >= arr.length) {
            //说明添加的下标不在合理范围之内,就返回原数组
            System.out.println("删除元素的下标不合法!");
            return arr;
        }
        //创建一个新数组,长度为原数组长度-1
        int[] newArr = new int[arr.length - 1];
        //定义一个变量记录新数组的下标
        int idx = 0;
        //遍历原数组
        for (int i = 0; i < arr.length; i++) {
            if (i != index) {
                newArr[idx++] = arr[i];
            }
        }
        return newArr;
    }

    /**
     * 根据元素删除数组中的元素(0,多个)
     *
     * @param arr    原数组
     * @param target 删除的目标元素
     * @return 删除元素后的新数组
     */
    public static int[] deleteElementByTarget(int[] arr, int target) {
        //判断数组是否为空
        if (arr == null) {
            System.out.println("数组参数不能为空!");
            return null;
        }
        //判断数组中有多少个target元素要删除
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == target) {
                count++;
            }
        }
        //根据计算出要删除的元素个数来新建数组
        int[] newArr = new int[arr.length - count];
        //循环元素组,把不要删除的元素放入到新数组中
        int idx = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != target) {
                newArr[idx++] = arr[i];
            }
        }
        return newArr;
    }

    /**
     * 数组元素排重
     *
     * @param arr 原数组
     * @return 排重后的结果
     */
    public static int[] noRepeatElement(int[] arr) {
        //创建新数组,长度等于原数组
        int[] newArr = new int[arr.length];
        int idx = 0;
        do {
            //把原数组第一个元素放入到新数组中
            newArr[idx++] = arr[0];
            //删除原数组中所有该元素
            arr = deleteElementByTarget(arr, arr[0]);
        } while (arr.length != 0);
        //处理新数组的长度
        newArr = Arrays.copyOf(newArr, idx);
        return newArr;
    }

    /**
     * 冒泡排序
     * 从小到大
     */
    public static void bubbleSort(int[] arr) {
        //外层控制循环的次数,n=arr.length-1
        for (int i = 0; i < arr.length - 1; i++) {
            //元素位置交换
            //第一次循环 比较arr.length-0-1次
            //第二次循环 比较arr.length-1-1次
            //第三次循环 比较arr.length-2-1次
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

    /**
     * 选择排序
     *
     */
    public static void selectionSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            int minIdx = i;
            for (int j = i; j < arr.length; j++) {
                if(arr[j] < arr[minIdx]){
                    minIdx = j;
                }
            }
            if(minIdx != i){
                int temp = arr[minIdx];
                arr[minIdx] = arr[i];
                arr[i] = temp;
            }
        }
    }
/**
     * 插入排序
     * @param arr
     */
    public static void sort(int[] arr){
        int n = arr.length;
        for( int i = 0 ; i < n ; i ++ ){
            // 寻找[i, n)区间里的最小值的索引
            int minIndex = i;
            for( int j = i + 1 ; j < n ; j ++ ) {
                if( arr[j] < arr[minIndex] ) {
                    minIndex = j;
                }
            }
            //数据交换不同索引位置数据
            swap( arr , i , minIndex);
        }
    }
    private static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

}
posted @ 2022-03-13 22:16  JanoCode  阅读(34)  评论(0)    收藏  举报