2021-06-09 数组

本文详细介绍了Java中的数组,包括数组的动态初始化、静态初始化、使用注意事项和细节,以及数组的引用、赋值机制、拷贝、反转、添加、缩减和排序。还特别讲解了冒泡排序的实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组介绍

数组可以存放多个同一类型的数据 数组也是一种是数据类型 是引用类型

即: 数组就是一组数据

double[] hens ={3,5,1,3.4,2,50}
  • double[] 表示 是double类型的数组
  • 数组名字hens
  • {}中表示数组的元素 依次表示数组的第几个元素
  • 遍历数组得到数组所有元素的和 使用for
  • 我们可以通过hens[下标] 来访问数组的元素
    • 下标是从0开始编号的
  • 通过for就可以循环的访问 数组的元素/值
  • 使用一个变量totalWeight将哥哥元素累计
        double[] hens={3,5,1,3.4,2,50};

        for (int i = 0; i < hens.length; i++) {
            System.out.println("第"+(i+1)+"个元素="+hens[i]);
        }

        double totalWeight=0;
        for (int i = 0; i < hens.length; i++) {
            totalWeight += hens[i];
        }
        System.out.println("总体重="+totalWeight);
        System.out.println("平均体重="+totalWeight/hens.length);

数组的使用

使用方式1-动态初始化
数组的定义

数据类型[] 数组名 =new 数据类型[大小]

int[] a = new int[5]; //创建了一个数组 名字a 存放5个int

数组的引用(使用/访问/获取)

数组名[下标/索引/index] //比如 你要使用a数组的第三个元素 a[2]

        double[] scores = new double[5];

        Scanner myScanner = new Scanner(System.in);

        for (int i = 0; i < scores.length; i++) {
            System.out.println("请输入第"+(i+1)+"个元素的值");
            scores[i] = myScanner.nextDouble();
        }

        System.out.println("当前数组的元素有以下");
        for (int i = 0; i < scores.length; i++) {
            System.out.println("第"+(i+1)+"个元素的值="+scores[i]);
        }
使用方式2-动态初始化
先声明数组

语法: 数据类型[] 数组名 ; 也可以 数据类型 数组名[]

int[] a; 或者 int a[];

创建数组

语法: 数组名 = new 数据类型[大小];

a= new int[10]

double scores[];    //声明数组 这时scores 是null
scores=new double[5];   //分配内存空间 可以存放数据
使用方式3-静态初始化
初始化数组

语法 : 数据类型 数组名[] ={元素值,元素值…}

int a[]={2,5,6,7,8,89}

数组使用注意事项和细节

ArrayDetail.java
  1. 数组是多个相同类型数据的组合,实现对这些数据的同一管理
  2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
  3. 数组创建后,如果没有赋值,有默认值
  • int 0
  • short 0
  • byte 0
  • long 0
  • float 0.0
  • double 0.0
  • char \u0000
  • boolean false
  • String null
  1. 使用数组的步骤
  • 声明数组并开辟空间
  • 给数组哥哥元素赋值
  • 使用数组
  1. 数组的下标是从0开始的
  2. 数组下标必须在指定范围内使用 否则报: 下标越界异常 比如 int[] arr=new int[5] ; 则有效下标为0-4
  3. 数组属引用类型 数组型数据对象是(object)

数组引用案例

/*
1 创建一个char类型的26个元素的数组 分别放置A-Z
  使用for循环访问所有元素并打印出来
  提示: char类型数据运算'A'+1 ->'b'
 */
public static void main(String[] args) {

    char arr[]= new char[26];

    for (int i = 0; i < arr.length; i++) {
        arr[i] = (char) ('A'+ i) ;  //'A'+1 是int 需要强转
    }

    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }
}
/*
请求出一个数组int[]的最大值{4,-1,9,10,23} 并得到对应的下标
 */
int arr[] = {4,-1,9,10,23};

int arrMax = arr[0] ;
int maxIndex = 0;

for (int i = 0; i < arr.length; i++) {
    if ( arr[i] > arrMax ) {
        arrMax = arr[i];
        maxIndex = i;
    }
}

System.out.println(arrMax);
System.out.println(maxIndex);

数组的赋值机制

  1. 基本数据类型赋值 这个值就是具体的数据 而且相互不影响

    int n1 =2 ; int n2= n1;

  2. 数组在默认情况下是引用传递 赋的值是地址

    int[] arr1={1,2,3};

    int[] arr2=arr1;

//基本数据类型赋值 赋值方式为值拷贝
//n2的变化 不会影响到n1的值
int n1=10;
int n2=n1;

n2=80;

System.out.println(n1); //10
System.out.println(n2); //80

//数组在默认情况下是引用传递 赋值是地址 赋值方式为引用赋值
//是一个地址 arr2变化会影响到 arr1
int[] arr1={1,2,3};
int[] arr2=arr1;    //把arr1赋给arr2

arr2[0]=10;

for (int i = 0; i < arr1.length; i++) {
    System.out.println(arr1[i]);         //10,2,3   
}

数组拷贝

//将 int[] arr1={10,20,30} 拷贝到arr2数组 要求数据空间是独立的

int[] arr1={10,20,30};

//创建一个新的 数组arr2 开辟新的数据空间

int[] arr2 = new int[arr1.length];

//遍历arr1 把每个元素拷贝到对应的位置

for (int i = 0; i < arr1.length; i++) {
    arr2[i] =arr1[i];
}

arr2[0]=100;

for (int i = 0; i < arr2.length; i++) {
    System.out.println(arr2[i]);    //100,20,30  arr1 10,20,30 不受影响
}

数组反转

//数组反转-不建新数组实现
int[] arr={11,22,33,44,55,66};
int len=arr.length;
int temp=0;

for (int i = 0; i < (len/2); i++) {
    temp=arr[len-1-i];
    arr[len-1-i] =arr[i];
    arr[i] = temp;
}

for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}
//数组反转-新建数组
int[] arr1={11,22,33,44,55,66};

int[] arr2= new int[arr1.length];

for (int i = 0; i < arr1.length; i++) {
    arr2[(arr2.length-1)-i]=arr1[i];
}

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

数组添加

要求: 实现动态的给数组添加元素效果 实现对数组扩容

  1. 原始数组使用静态分配 int[] arr ={1,2,3}
  2. 增加的元素 直接放在数组的最后 arr={1,2,3,4}
        int[] arr={1,2,3};
        int[] arrNew=new int[arr.length+1];

        for (int i = 0; i < arr.length; i++) {
            arrNew[i]=arr[i];
        }

        arrNew[arrNew.length-1]=4;

        arr=arrNew;

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

Scanner myScanner = new Scanner(System.in);

int[] arr={1,2,3};

do{

    int[] arrNew=new int[arr.length+1];

    for (int i = 0; i < arr.length; i++) {
        arrNew[i]=arr[i];
    }

    System.out.println("添加的数字是多少");

    int addResult=myScanner.nextInt();

    arrNew[arrNew.length-1]= addResult;

    arr=arrNew;

    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i]+"\t");
    }

    System.out.println("请问是否继续 y/n");

    char key= myScanner.next().charAt(0);

    if(key=='n'){
        break;
    }

}while (true);

System.out.println("退出循环");

数组缩减

Scanner myScanner = new Scanner(System.in);

int[] arr={1,2,3,4};

do{

    int[] arrNew=new int[arr.length-1];

    for (int i = 0; i < arrNew.length; i++) {
        arrNew[i]=arr[i];
    }

    arr=arrNew;

    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i]+"\t");
    }

    if(arr.length==1){
        System.out.println("只剩最后一个元素");
        break;
    }

    System.out.println("是否继续缩减 y/n");
    String result= myScanner.next();


    if(result.equals("n")){
        break;
    }

}while (true);

System.out.println("退出");

排序的介绍

排序是将多个数据 依指定的顺序进行排列的过程

排序的分类

  • 内部排序

    指将需要处理的所有数据都加载到内部存储器中进行排序 包括(交换式排序法 选择式排序法和插入式排序法)

  • 外部排序法

    数据量过大 无法全部加载到内存中 需要借助外部存储进行排序 包括(合并排序法 和直接合并排序法)

冒泡排序

通过对待排序序列从后向前(从下标较大的元素开始) 依次比较相邻元素的值 若发现逆序则交换 使值较大的元素逐渐从前移向后部 就像水底下的气泡一样逐渐向上冒

int[] arr={24,69,80,57,13};

int temp=arr[0];

for(int j=0; j<arr.length-1;j++){
    for (int i = 0; i < arr.length-1-j; i++) {
        if(arr[i]>arr[i+1]){
            temp=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=temp;
        }
    }
}

for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i]+"\t");
}

可以使用Java中的日期时间类来实现租金计划的生成。具体实现步骤如下: 1. 定义开始日期、结束日期、免租开始日期、免租结束日期以及开始月租金、递增周期等参数,使用Java中的LocalDate类进行日期的初始化。 2. 根据递增周期计算出一年内的月份数,并定义一个数组用来存储每个月的租金。 3. 对于每个月,判断是否在免租期内,如果是则该月租金为0,否则按照递增率计算出该月的租金。 4. 将每个月的租金存储到数组中,并输出计算过程。 下面是示例代码实现: ``` import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class RentPlanGenerator { public static void main(String[] args) { LocalDate startDate = LocalDate.of(2021, 3, 1); // 租赁开始时间 LocalDate endDate = LocalDate.of(2022, 3, 1); // 租赁结束时间 LocalDate freeStartDate = LocalDate.of(2021, 3, 1); // 免租开始时间 LocalDate freeEndDate = LocalDate.of(2021, 3, 31); // 免租结束时间 double startRent = 600; // 开始月租金 double incrementRate = 0.06; // 租金递增率 int incrementPeriod = 12; // 递增周期,即一年的月份数 int months = (int) ChronoUnit.MONTHS.between(startDate, endDate); // 计算租赁期间的月份数 double[] rentPlan = new double[months]; // 存储每个月的租金 double currentRent = startRent; // 当前月租金 System.out.println("租赁开始时间:" + startDate); System.out.println("租赁结束时间:" + endDate); System.out.println("免租开始时间:" + freeStartDate); System.out.println("免租结束时间:" + freeEndDate); System.out.println("开始月租金:" + startRent); System.out.println("递增周期:" + incrementPeriod + "个月"); System.out.println(); System.out.println("计算过程:"); for (int i = 0; i < months; i++) { LocalDate currentDate = startDate.plusMonths(i); // 当前月份 if (currentDate.isAfter(freeStartDate) && currentDate.isBefore(freeEndDate.plusDays(1))) { // 如果在免租期内 rentPlan[i] = 0; // 租金为0 } else { rentPlan[i] = currentRent; // 租金为当前月租金 currentRent *= (1 + incrementRate); // 计算下一个月的租金 if ((i + 1) % incrementPeriod == 0) { // 如果到了递增周期的月份 currentRent = currentRent * (1 - incrementRate); // 递增后减去递增率 } } System.out.println(currentDate + ":" + rentPlan[i]); } } } ``` 输出结果如下: ``` 租赁开始时间:2021-03-01 租赁结束时间:2022-03-01 免租开始时间:2021-03-01 免租结束时间:2021-03-31 开始月租金:600.0 递增周期:12个月 计算过程: 2021-03-01:0.0 2021-04-01:636.0 2021-05-01:675.84 2021-06-01:717.72 2021-07-01:761.83 2021-08-01:808.32 2021-09-01:857.34 2021-10-01:909.09 2021-11-01:963.74 2021-12-01:1021.51 2022-01-01:1082.63 2022-02-01:1147.34 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值