Java-day08研究ノート

day07レビュー

ここに画像の説明を挿入

1つは、配列

1.1配列の一般的な例外

①配列インデックスの範囲外例外(ArrayIndexOutOfBoundsException)

public class Demo {
    
    

    public static void main(String[] args) {
    
    

        //先定义一个数组
        int[] arr = {
    
    11, 22, 33};

        //获取数组中数据
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println(arr[3]);  //数组索引越界异常 ArrayIndexOutOfBoundsException

    }
}

ここに画像の説明を挿入

出现问题的原因:因为数组的索引是从0开始的,所以数组最大的索引只能是数组的长度-1,以上异常是因为超过数组的索引了。

如何解决:在访问之前先确定好数组的长度,进而确定数组的最大索引,以免使用的时候超过最大索引。

②NullPointerException(NullPointerException)

public class Demo2 {
    
    

    public static void main(String[] args) {
    
    

        int[] arr = {
    
    11, 22, 33};

        arr = null;
        System.out.println(arr[1]);  //空指针异常 NullPointerException
    }

}

ここに画像の説明を挿入

出现异常的原因:因为数组的引用指向了一个null,而null在内存中不代表任何位置,所以再访问的时候就报的是空指针异常。

如何解决?在使用之前先判断对象(引用)是否为空,如果不为null再执行。

1.2配列の一般的な操作

①アレイのトラバース

トラバーサルとは、配列内のデータを最後から1つずつ取得することです。

public class Demo {
    
    

    public static void main(String[] args) {
    
    

        int[] arr = {
    
    11, 22, 33, 44, 55};

        //第一种方式:
//        System.out.println(arr[0]);
//        System.out.println(arr[1]);
//        System.out.println(arr[2]);
//        System.out.println(arr[3]);
//        System.out.println(arr[4]);

        //第二种方式:使用for循环改进
//        for(int i = 0; i < 5; i++){
    
    
//
//            System.out.println(arr[i]);
//        }

        /*
            第三种方式:使用for循环改进,同时通过数组的方法来获取数组的长度

            获取数组长度的方法:
                数组名.length;
            
            注意:此length方法没有小括号
         */
//        System.out.println(arr.length);
        for(int i = 0; i < arr.length; i++){
    
    

            System.out.println(arr[i]);
        }

    }
}

②配列の最大値

配列の最大値または最小値を取得します

ここに画像の説明を挿入

public class Demo2 {
    
    

    public static void main(String[] args) {
    
    

        int[] arr = {
    
    11, 33, 22, 55, 44};

        //先假定一个数据为最大值,如arr[0],相当于擂台
        int max = arr[0];

        //遍历数组
        for(int i = 1; i < arr.length; i++){
    
    

            //在擂台上进行比较
            if(arr[i] > max){
    
    
                max = arr[i];
            }
        }

        System.out.println("最大值为:" + max);
    }
}

③2つの変数の値を交換します

/*
    交换两个变量的值
 */
public class Demo3 {
    
    

    public static void main(String[] args) {
    
    

        int a = 3;
        int b = 5;

        //方式一:【掌握】先定义一个临时变量将a的值存储起来(后面a再被修改的时候,temp的值不会变化)
        int temp = a;
        a = b;
        b = temp;

        //方式二:
//        int sum = a + b;
//        a = sum - a;
//        b = sum - a;

        //方式三:【了解】一个数对另外一个数异或两次得到的结果还是自己
//        a = a^b;
//        b = a^b;
//        a = a^b;

        //方式四:
//        a = (a + b) - (b = a);

        System.out.println(a);
        System.out.println(b);
    }
}

④配列を逆にします(逆順)

例:元の配列は{11、22、33、44、55}で、逆順の後の配列は{55、44、33、22、11}です。

public class Demo4 {
    
    

    public static void main(String[] args) {
    
    

        int[] arr = {
    
    11, 22, 33, 44, 55};

        //方法一:
        //将通过方法获取到的新数组地址赋给原数组
//        arr = reverse(arr);

        //方式二: 【常用】
//        reverse2(arr);

        //方式三:
        reverse3(arr);

        //遍历
        for(int i = 0; i < arr.length; i++){
    
    

            System.out.println(arr[i]);
        }
    }

    /*
        数组的反转:

        两个明确:
            返回值类型:int[]
            参数列表:int[] a

     */
    public static int[] reverse(int[] a) {
    
    

        //1. 新建一个数组,类型及长度都和原数组相同
        int[] arr_xin = new int[a.length];

        //2. 倒着遍历原数组并将内容正向存入新数组中
        for(int i = 0; i < a.length; i++){
    
    

            arr_xin[i] = a[a.length-1-i];
        }

        return arr_xin;
    }

    public static void reverse2(int[] a) {
    
    

        for (int i = 0; i < a.length / 2; i++) {
    
    

            /*
                   a[0]     a[a.length-1-0]
                   a[1]     a[a.length-1-1]

                   a[i]     a[a.length-1-i]
             */
            int temp = a[i];
            a[i] = a[a.length-1-i];
            a[a.length-1-i] = temp;
        }

    }

    public static void reverse3(int[] a) {
    
    

        //int b = 3;


        for(int start = 0, end = a.length-1; start < end; start++, end--) {
    
    

            int temp = a[start];
            a[start] = a[end];
            a[end] = temp;
        }
    }
}

⑤配列の並べ替え

並べ替えは、小さいものから大きいもの(昇順)または大きいものから小さいもの(降順)です。

例:昇順{11、22、33、44、55}の後の配列{33、11、44、22、55}

import java.util.Arrays;

public class Demo5 {
    
    

    public static void main(String[] args) {
    
    

        int[] arr = {
    
    33, 11, 44, 22, 55};

        //方式一:冒泡排序
//        sort(arr);

        //方式二:选择排序
//        sort2(arr);

        //方式三:通过Arrays工具类提供的sort方法进行排序
        Arrays.sort(arr);

        //遍历
        for (int i = 0; i < arr.length; i++) {
    
    

            System.out.println(arr[i]);
        }

    }

    /*
          冒泡排序
     */
    public static void sort(int[] arr){
    
    

        //控制的是轮数
        for(int i = 0; i < arr.length - 1; i++) {
    
    
            //控制的是每轮比较的次数
            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;
                }
            }
        }
    }

    /*
          选择排序
     */
    public static void sort2(int[] arr) {
    
    

        //控制轮数
        for(int i = 0; i < arr.length - 1; i++) {
    
    

            //定义一个变量,用来存储每一轮的最小值
            int min = arr[i];

            //定义一个变量,用来存储每一轮最小值所处的索引位置
            /*
                此处为什么定义为i?
                    如果经过一轮比较之后,有更小的值产生了,那么这个index值会更新;
                    如果经过一轮比较滞后,没有更小的值,那么最小值的索引还是本身,交换之后对结果不产生影响
             */
            int index = i;

            //控制的是比较的次数
            for(int j = i+1; j < arr.length; j++) {
    
    

                if(min > arr[j]){
    
    

                    min = arr[j];
                    index = j;
                }
            }

            //拿每一轮实际的最小值和刚开始假定的最小值进行交换
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }

    }

}

バブルソート↓

バブルソート

並べ替えを選択↓

ソートを選択

⑥配列を探す

整数が配列に存在するかどうかを見つけるメソッドを提供します。存在する場合は、配列内の整数のインデックスを返します。存在しない場合は、-1を返します。

public class Demo7 {
    
    

    public static void main(String[] args) {
    
    

        int[] arr = {
    
    11, 22, 33, 44, 55};

        System.out.println(getIndex(arr, 999));

    }

    /*
            两个明确:
               返回值类型:int
               参数列表:int[] arr, int numser
     */
    public static int getIndex(int[] arr, int number) {
    
    

        //定义一个变量,用来存储索引
        int index = -1;

        for (int i = 0; i < arr.length; i++) {
    
    

            if(number == arr[i]) {
    
    

                index = i;
            }
        }

        return index;
    }

}

2次元配列

2次元配列は、複数の1次元配列を要素として構成された配列です。

2.1ステートメント

数据类型[][] 数组名 = new 数据类型[m][n];

解释:
	数据类型:就是数组中存放元素的数据类型,这个类型可以是基本数据类型,也可以是引用数据类型
	[][]:代表了这是一个二维数组
	数组名:就是一个变量名
	=:将二维数组的地址赋给数组名(引用)
	new:用来在堆上开辟一个空间
	数据类型:同上
	m和n:
		m:一个二维数组中存放了m个一维数组
		n:每一个一维数组中的元素个数

2.22次元配列の初期化

①動的初期化

数组名[a][b] = 数据;

如:
	arr[0][0] = 11;
    arr[0][1] = 22;
    arr[1][0] = 33;
    arr[1][1] = 44;

②静的初期化

数据类型[][] 数组名 = {
    
    {
    
    元素1, 元素2, ...}, {
    
    元素1, 元素2, ...}, {
    
    元素1, 元素2, ...}, ...};

如: 
    int[][] arr = {
    
    {
    
    11, 22, 33}, {
    
    44}, {
    
    55, 66}};

2.32次元配列要素の取得

数组名[a][b]

2.42次元配列の走査

public class Demo4 {
    
    

    public static void main(String[] args) {
    
    

        int[][] arr = {
    
    {
    
    11, 22, 33}, {
    
    44}, {
    
    55, 66}};

        //1. 遍历二维数组获取到每一个一维数组
        for(int i = 0; i < arr.length; i++) {
    
    
            //2. 遍历一维数组
            for(int j = 0; j < arr[i].length; j++) {
    
    

                System.out.println(arr[i][j]);
            }

        }

    }
}

おすすめ

転載: blog.csdn.net/ChangeNone/article/details/112319386