Java随堂小记05

数组

每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问他们
在这里插入图片描述

定义: int [] nums;

存放10个int类型的数据: nums = new int[10];

    int[] nums = new int[10];//和Scanner s1=new Scanner(System.in)一样
package www.Dongyi.Scanner;

public class Demo8 {
    public static void main(String[] args) {
        int[] nums = new int[10];
        nums[0] = 1;
        nums[1] = 2;
        nums[2] = 3;
        nums[3] = 4;
        nums[4] = 5;
        nums[5] = 6;
        nums[6] = 7;
        nums[7] = 8;
        nums[8] = 9;
        nums[9] = 10;

        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum+=nums[i];
        }
        System.out.println(sum);
    }
}

数组的常见异常

1. 数组下标越界异常:ArrayIndexOutOfBoundsException

下标的合法区间:[0,length - 1];

public static void main(String[] args) {
	int[] x = { 1, 2, 3 };
	System.out.println(x[3]);
}
  1. 空指针异常:NullPointerException
public static void main(String[] args) {
	int[] x = { 1, 2, 3 };
	x = null;
	System.out.println(x[1]);
}

三种数组的初始化

在这里插入图片描述

1、静态初始化:创建 + 赋值
int[] arr1 = { 1, 2, 3, 4, 5 };
int[] arr2 = new int[] { 1, 2, 3, 4, 5 };

2、动态初始化:包含默认初始化,即未赋值的系统会自动为你赋值0
int[] arr3=new int[3];
arr3[0]=1;
arr3[1]=2;
System.out.println(b[1]);//值为0

数组的使用

增强型for循环,省略了下标,不利于操作数组元素

package www.Dongyi.Scanner;

public class DemArrays {
    public static void main(String[] args) {
         int[] arrays = {1,2,3,4,5};
        for (int array : arrays) {
            System.out.println(array);
        }
    }
}

翻转数组:

package www.Dongyi.Scanner;

public class DemArray02 {
    public static void main(String[] args) {
        int[] arrays = {1,2,3,4,5};
        printArray(arrays);//打印
        System.out.println();//先输出再换行
        int[] reverse = reverse(arrays);
        printArray(reverse);//打印
    }

    public static void printArray(int[] arrays){//打印
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]+" ");
        }
    }
    public static int[] reverse(int[] arrays){//逆置
        for (int i=0;i< arrays.length/2;i++) {
            int temp = arrays[i];
            arrays[i] = arrays[arrays.length-i-1];
            arrays[arrays.length-i-1]=temp;
        }
        return arrays;
    }
}

二维数组

遍历

package www.Dongyi.Scanner;

public class DemoArrays03 {
    public static void main(String[] args) {
        int[][] array = {{1,2},{2,3},{3,4},{4,5}};
        printArray(array);
    }

    public static void printArray(int[][] arrays){//打印
        for (int i = 0; i < arrays.length; i++) {
            for (int j = 0; j < arrays[i].length; j++) {
                System.out.print(arrays[i][j]+" ");
            }
            System.out.println();
        }
    }
}

Arrays类

导包:import java.util.Arrays

打印数组:Arrays.toString(变量名)

package www.Dongyi.Scanner;

import java.util.Arrays;

public class DemoToString {
        public static void main(String[] args) {
            int[] arr = {1,3,56,78,4245,53675,786,46};
            System.out.println(arr);//[I@1b6d3586,这是一个hashcode,输出对象
            System.out.println(Arrays.toString(arr));
            System.out.println("===============================");
            printArray(arr);
        }
       public static void printArray(int[] arr){
            for (int i=0;i<arr.length;i++){
                if(i==0){
                    System.out.print("[");
                }
                if(i== arr.length-1){
                    System.out.print(arr[i]+"]");
                }else {
                    System.out.print(arr[i]+", ");
                }
            }
       }
}

升序排序:Arrays.sort(arr)

        int[] arr ={23,26,46,889,357,295,725};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));

冒泡排序

package www.Dongyi.Scanner;

import java.util.Arrays;

public class bubbleSort {
    public static void main(String[] args) {
        int[] arr ={23,76,46,889,357,295,725};
        System.out.println("排序前");
        System.out.println(Arrays.toString(arr));
        System.out.println("排序后");
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void bubbleSort(int[] arr){
        boolean flag = false;//通过flag标识位减少没有意义的比较
        int temp=0;
        for(int i=0;i< arr.length;i++){
            for (int j=0;j< arr.length-i-1;j++){
                if(arr[j]>arr[j+1]){
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                    flag=true;
                }
            }
            if (flag==false){
                break;
            }
        }
    }
}

数组填充:Arrays.fill()

import java.util.Arrays;
public class ArrayFill {
    public static void main(String[] args) {
        int[] a = {37,45,67,23,7};

        //数组填充
     Arrays.fill(a,0);
      System.out.println(Arrays.toString(a));

        //指定填充
      Arrays.fill(a,2,4,0);//下边2到4变为0
       System.out.println(Arrays.toString(a));
    }
}

稀疏棋盘

for.each循环,遍历数组的简单写法

package www.Dongyi.Scanner;

public class DemoArrays04 {
        public static void main(String[] args) {
            //1、创建一个二维数组11*11   0:没有棋子  1:黑棋    2:白棋
            int[][] array = new int[11][11];
            array[1][2] = 1;
            array[2][3] = 2;

            System.out.println("原始数组:");
            for (int[] ints : array) {
                for (int anInt : ints) {
                    System.out.print(anInt+"\t");
                }
                System.out.println();
            }

            //获取有效值的个数
            int sum = 0;
            for (int i = 0; i < array.length; i++) {
                for (int j = 0; j < array[i].length; j++) {
                    if(array[i][j]!=0){
                        sum++;
                    }
                }
            }
            System.out.println("有效值个数:"+sum);

            //2.创建一个稀疏数组
            int[][] array2 = new int[sum+1][3];//3列,分别是行、列、有效值

            array2[0][0] = 11;//总共有11行
            array2[0][1] = 11;//总共有11列
            array2[0][2] = sum;//有效值是sum个

            int count = 0;
            for (int i = 0; i < array.length; i++) {
                for (int j = 0; j < array[i].length; j++) {
                    if(array[i][j]!=0){
                        count++;
                        array2[count][0] = i;//行
                        array2[count][1] = j;//列
                        array2[count][2] = array[i][j];//有效值
                    }
                }
            }
            //打印稀疏数组
            System.out.println("稀疏数组:");
            System.out.println("行\t"+"列\t"+"有效值\t");
            for (int i = 0; i < array2.length; i++) {
                for (int j = 0; j < 3; j++) {
                    System.out.print(array2[i][j]+"\t");
                }
                System.out.println();
            }
            System.out.println("===========================");
            System.out.println("还原");
            //1.读取稀疏数组
            int[][] array3 = new int[array2[0][0]][array2[0][1]];//第0行0列:总行数   第0行1列:总列数

            //2.给元素还原它的值
            for(int i = 1;i< array2.length;i++){
                array3[array2[i][0]][array2[i][1]] = array2[i][2];
                //array3[行][列] = 有效值
                //即把有效值按照有效值坐标的位置赋值给新数组,其余系统默认为0
            }
            System.out.println("还原数组:");
            for (int[] ints : array3) {
                for (int anInt : ints) {
                    System.out.print(anInt+"\t");
                }
                System.out.println();
            }
        }
    }
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.javaJava类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值