java-数组

原文地址:https://www.cnblogs.com/lyang-a/p/11434528.html

一维数组定义:

// 1数据类型[] 数组名 = new 数组类型[数组长度];    
String[] str = new String[10];

//2数据类型[] 对象数组名 = new 类名称[] {对象,对象......};
  
String[] str = new String[]{“a”,"b"}

//数据类型[] 对象数组名 = {对象,对象......};

String[] str = {“a”,"b"}

二维数组定义:

//元素类型[][]  数组名 = new 元素类型[数组长度1][数组长度2];

String[][] str2 = new String[2][3]; // 可以认为创建一个两行三列的数组

//数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
String[][] str = {{"a","1"},{"b","2"}};

//数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
String[][] str2 = new String[][]{{"a","1"},{"b","2"}};

一维数组遍历

使用for循环遍历获取数组元素

int[] arr = {11, 22, 33, 44, 55, 66, 77};
// for循环遍历数组
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

或者用增强for循环:

for (int s : arr) {
    System.out.println(s);
}

二维数组遍历

/ 使用嵌套循环(两层for循环)遍历
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++){
        sum +=arr[i][j];
        System.out.print(arr[i][j] + "	");
    }
}

  

数组的操作:

插入
    a)插入元素之前,先判断数组是否还能存得下插入的元素,如果存不下那么需要执行扩容操作。
    原因:数组一旦创建完毕,那么数组的空间长度就不能发生变化了!
    b)插入元素时,为了保证数组是一块连续的内容空间,那么我们需要对插入位置之后的元素做位移操作。
  位移操作:向后移动一位

  删除
    a)删除元素时,为了保证数组是一块连续的内容空间,那么我们需要对删除位置之后的元素做位移操作。
    位移操作:向前移动一位

/*
 * 增删改查
 * 
 */

/**
 * 根据下标查询元素
 * 
 * @param arr
 * @param index
 * @return 整型元素
 * @author ZZY
 * @time 2018-12-07 14:35
 */
public static int queryElementByIndex(int[] arr, int index) {

    return arr[index];
}

/**
 * 根据元素查找下标
 * 
 * @param arr
 * @param ele
 * @return 元素下标
 */
public static int queryIndexByElement(int[] arr, int ele) {

    int index = -1; // 用来记录下标的变量
    // 1:遍历所有的元素
    for (int i = 0; i < arr.length; i++) {
        // 2 用你要查找的元素和所有的元素做==比较
        if (arr[i] == ele) {
            // 3 相等判断成立,记录当前元素的下标
            index = i;// 记录当前元素的下标
            break; // 后面元素就不用判断了
        }
    }
    return index;
}

/**
 * 求数组的最大值
 * 
 * @param arr
 * @return 最大值
 */
public static int maxValue(int[] arr) {
    // 1 假设第一个元素是最大值
    int max = arr[0];
    // 2:遍历数组
    for (int i = 1; i < arr.length; i++) {
        // 3 用这个个最大值和后面的元素做大于比较
        if (arr[i] > max) {
            // 4如果后面的元素比这个最大值还大,那么后面的元素就是最大值
            max = arr[i];
        }
    }
    return max;
}

/**
 * 求数组的最小值
 * 
 * @param arr
 * @return 最小值
 */
public static int minValue(int[] arr) {
    // 1 假设第一个元素是最小值
    int min = arr[0];
    // 2:遍历数组
    for (int i = 1; i < arr.length; i++) {
        // 3 用后面的元素这个最小值和做小于比较
        if (arr[i] < min) {
            // 4如果后面的元素比这个最小值还小,那么后面的元素就是最小值
            min = arr[i];
        }
    }
    return min;
}

/**
 *  给数组添加元素
 * @param arr
 * @param ele
 * @param index
 * @return  返回新的数组
 */
public static int[] addElement(int[] arr, int ele, int index) {
    

    // 1:新建一个数组,长度是原数组长度+1 数组扩容
    int[] newArr = new int[arr.length + 1];
    if(index>=0 && index<newArr.length){

        // 2 拿到下标为3的前面的元素,放到新数组按照0 1 2 顺序依次存放
        for (int i = 0; i < index; i++) {
            newArr[i] = arr[i];
        }

        // 3 把要添加的元素100放入新数组下标为3的位置
        newArr[index] = 100;

        // 4 拿到下标为3的后面的元素,放到新数组按照 4 5 顺序依次存放

        for (int i = index; i < arr.length; i++) {
            newArr[i + 1] = arr[i];
        }
    }else{
        System.out.println("索引超出范围");
        //超出范围,返回旧数组
        return arr;
    }        
    
    // 5:返回新数组
    return newArr;

}

/**
 * 根据下标删除元素
 * @param arr
 * @param index
 * @return  原数组
 */
public static int[] delEleByIndex(int[] arr,int index){
    
    if(index>=0 && index<arr.length){
        //1:找到下标为2的元素,后面的元素依次覆盖前面的元素
        for(int i = index;i<arr.length-1;i++){
            arr[i] = arr[i+1];
        }
        
        //2:把最后一位赋值为0
        arr[arr.length-1] = 0;
        
    }else{
        System.out.println("没有此下标");
    }
    //3 返回删除后的数组
    return arr;
    
}

/**
 * 根据元素删除元素
 * @param arr
 * @param ele
 * @return  下标
 */
public static int delEleByEle(int[] arr,int ele){
       //1 :定义删除元素的下标
        int index = -1;
        
        //2:用你要删除的元素和数组里面的每一个元素做==比较
        for(int i = 0;i<arr.length;i++){
            if(ele==arr[i]){
              //3:找到要删除的元素后,记录下当前元素的下标
                index = i;
                break; //后面就不要比较了
            }
        }
        //如果index是-1,直接返回,不需要移位
        if(index==-1){
            return index;
        }
         //4:然后后面的下标依次向前移位
        for(int i = index;i<arr.length-1;i++){
            arr[i] = arr[i+1];
        }

        //5:把最后一位置为0
        arr[arr.length-1] = 0;
        //6  返回数组的下标即可
        return index;
}


public static void main(String[] args) {
    int[] arr = { 10, 20, 300, 40, 50 };
    
    int index = delEleByEle(arr,300);
    if(index!=-1){
        for (int i : arr) {
            System.out.println(i);
        }
    }else{
        System.out.println("没有此元素");
    }
    
    /*arr = delEleByIndex(arr,2);
    for (int i : arr) {
        System.out.println(i);
    }
    */
    
    
    
    
/*    int[] newArr = addElement(arr,100,-12);
    
    for (int i : newArr) {
        System.out.println(i);
    }*/
    
    /*int max = maxValue(arr);
    int min = minValue(arr);
    System.out.println("最大值是:" + max);
    System.out.println("最小值是:" + min);





import java.util.Arrays;

public class ArraysUtil {
    public static void main(String[] args) {
        int[] arr = { 5, 12, 90, 18, 77, 76, 45, 28, 59, 72 };
        
        // 字符串输出
        //toString(arr);
        
        // 升序排序
        //sort(arr);
        
        // 判断数组是否相等
        //equals();

        // 二分法查找
        //binarySearch();
        
        // 数组复制
        //copyOf(arr);
        //copyOfRange(arr);
        
        /* System类中的arraycopy方法
         public static native void arraycopy(Object src,  int  srcPos,
                                                Object dest, int destPos,
                                                int length);
         作用:就是用于实现数组元素的拷贝工作。
         建议:如果需要实现对数组元素的拷贝工作,建议使用System类中的arraycopy方法,而不要去用Arrays工具类中的copyOf()和copyOfRange()方法
         方法参数分析:
                 src:需要被拷贝的数组(源数组)
                 srcPos:从源数组中的那个位置开始拷贝,传递是一个索引值
                 dest:目标数组,也就是把拷贝的元素放入目标数组中
                  destPos:把拷贝的元素放在目标数组中的哪个位置,传递是一个索引值
                  length:拷贝数组的元素个数*/
        // 复制数组建议使用这种
        int[] dest = new int[5];
        System.arraycopy(arr, 2, dest, 0, 5);
        System.out.println(Arrays.toString(dest));
                  
         /*native关键字介绍:
                 使用关键字“native”修饰的方法,我们称之为本地方法。
                   本地方法特点:只有方法的声明,没有方法的实现(没有方法体)。
                   为什么会有本地方法的出现呢???
                       java虽然很强大,但是也有局限性。java不能直接操作硬件!
                       java中提供的本地方法,本质上就是通过本地方法来调用别的语言(例如:C语言)来操作硬件。*/
        
        
    }

    /**
     * 范围复制数组
     * @param arr 传入的数组
     */
    public static void copyOfRange(int[] arr) {
        /*int[] copyOfRange = Arrays.copyOfRange(arr, 2, 8);
        for (int i : copyOfRange) {
            System.out.print(i + "  ");
        }*/
        
        int[] copyOfRangeArrays = copyOfRangeArrays(arr, 2, 8);
        for (int i : copyOfRangeArrays) {
            System.out.print(i + "  ");
        }
    }

    /**
     * 手写实现范围复制数组
     * @param arr 传入的数组
     * @param from  取值的初始索引
     * @param to  取值的结束索引
     * @return 返回的新数组
     */
    public static int[] copyOfRangeArrays(int[] arr,int from,int to) {
        // 0.判断form和to是否合法
        if (to < from || to < 0 || from < 0 || to >= arr.length) {
            System.out.println("传入的to或from不合法!");
            throw new RuntimeException();
        }
        int length = to - from;
        int[] arr2 = new int[length];
        // 方案一:
        for (int i = 0; i < arr2.length; i++) {
            arr2[i] = arr[from + i];
        }
        /*// 方案二:
          for(int i = from; i < to; i++) { 
            arr2[i - from] = arr[i];
        }*/
        /*// 方法三:
         for(int i = from, j = 0; i < to; i++, j++) {
            arr2[j] = arr[i];
        }*/
        arr = arr2;
        return arr;
    }
    
    /**
     * 赋值数组
     * @param arr 传入的数组
     */
    public static void copyOf(int[] arr) {
        /*int[] arr2 = new int[4];
        int[] copyOf = Arrays.copyOf(arr, 4);
        arr2 = copyOf;
        for (int i : arr2) {
            System.out.print(i + "  ");
        }*/
        
        int[] copyOfArrays = copyOfArrays(arr,4);
        for (int i : copyOfArrays) {
            System.out.print(i + "  ");
        }
    }
    
    /**
     * 手写实现copy数组方法
     * @param arr 传入的数组
     * @param length 截取的长度
     * @return 返回截取的数组
     */
    public static int[] copyOfArrays(int[] arr,int length) {
        int[] arr2 = new int[length];
        for (int i = 0; i < arr2.length; i++) {
            arr2[i] = arr[i];
        }
        arr = arr2;
        return arr;
    }

    /**
     * 二分法查找 (数组必须有序)
     * @param arr 传入的数组
     */
    public static void binarySearch() {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        
        /*int binarySearch = Arrays.binarySearch(arr, 6);
        System.out.println(binarySearch);*/
        
        int binarySearch = binarySearch(arr, 6);
        System.out.println(binarySearch);
        
    }
    
    /**
     * 手写实现二分法查找
     * @param arr 传入的数组
     * @param value 传入的值
     * @return 返回数组中查找值的索引
     */
    public static int binarySearch(int[] arr,int value){
        int min = 0,max = arr.length - 1,mid = 0;
        for (int i = 0; i < arr.length; i++) {
            mid = (min + max) / 2;
            if (value > arr[mid]) {
                min = mid + 1;
            }else if(value < arr[mid]){
                max = mid - 1;
            }else {
                return mid;
            }
            if (max < min) {
                return -1;
            }
        }
        return mid;
    }

    /**
     * sort方法
     * @param arr 传入的数组
     */
    private static void sort(int[] arr) {
        // Arrays.sort(arr);
        int[] sortArrays = sortArrays(arr);
        for (int i : sortArrays) {
            System.out.print(i + "  ");
        }
    }
    
    /**
     * 手写实现sort方法(冒泡法)
     * @param arr 传入的数组
     * @return 返回排序后(升序)的数组
     */
    public static int[] sortArrays(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            // 假设数组是有序的
            boolean flag= true;
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j+1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = false; // 推翻假设
                }
            }
            if (flag) { // 如果有序直接跳出循环
                break;
            }
        }
        return arr;
    }

    /**
     * toString方法
     * @param arr 传入的数组
     */
    public static void toString(int[] arr) {
        // System.out.println(Arrays.toString(arr));

        System.out.println(toStringArrys(arr));
    }

    /**
     * 手写实现tostring方法
     * @param arr 传入的数组
     * @return 返回的字符串
     */
    private static String toStringArrys(int[] arr) {
        String str = "";
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                str += arr[i] + ",";
            } else {
                str += arr[i] + "]";
            }
        }
        return str;
    }
    
    /**
     * rquals方法
     */
    public static void equals() {
        int[] arr1 = {1,2,3,4};
        int[] arr2 = {1,2,3,4};
        /*boolean equals = Arrays.equals(arr1, arr2);
        System.out.println(equals);*/
        
        boolean equals = equalsArrays(arr1, arr2);
        System.out.println(equals);
    }

    /**
     * 手写实现rquals方法
     * @param arr1 传入的第一个数组
     * @param arr2 传入的第二个数组
     * @return 如果相同则为true,不同则为false
     */
    public static boolean equalsArrays(int[] arr1, int[] arr2) {
        if (arr1 == arr2) 
            return true;
        if (arr1 == null || arr2 == null) 
            return false;
        if (arr1.length != arr2.length) 
            return false;
        for (int i = 0; i < arr2.length; i++) {
            if (arr1[i] != arr1[i]) {
                return false;
            }
        }
        return true;
    }
    
}
原文地址:https://www.cnblogs.com/shanghuliu/p/13593908.html