Day04
IDEA
- 项目层级关系
- project-module-package-class
- 小结
- project中可以创建多个module
- module中可以创建多个package
- package中可以创建多个class
- 这些结构的划分是为了方便管理类文件的。
- 常用快捷键
- psvm+回车:快速生成main方法
- sout+回车:快速生成输出语句
- alt+1:打开/隐藏工程目录结构
- alt+4:打开/隐藏控制台
- Ctrl+alt+L:格式化代码
- alt+enter:代码修正提示
- Ctrl+D:向下复制一行
- Ctrl+X:剪切当前行
- Ctrl+/:批量加入单行注释,再按一次就是取消
- Ctrl+shift+/:批量加入多行注释,再按一次就是取消
- Alt+shift+up键:上移代码
- Alt+shift+down键:下移代码
- 数字.fori:自动生成for循环
数组
数组是一种容器,用来存储(同种数据)的多个值。
总结:数组容器在存储数据的时候,需要结合数据类型考虑。
建议:容器的类型,和存储的数据类型保持一致。
定义格式:
- 格式一:数据类型[] 数组名; eg: int[] arr;
- 格式二:数据类型 数组名[]; eg: int arr[];
数组初始化
-
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
- 格式:数据类型[] 变量名 = new 数据类型[数组长度];eg:int[] arr = new int[10];
- 注:打印数组变量的时候,会打印出数组的内存地址。
-
数组的元素访问格式:
数组名[索引]
-
索引:数组中数据的编号方式,编号从0开始
-
作用:访问数组容器中的空间位置
-
注:数组在创建完毕后,即使没有赋值,也可以取出数组的默认值。
-
-
静态初始化:初始化时,就可以指定数组要存储的元素,系统还会自动计算出该数组的长度;
- 格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,…}; eg: int[] arr = new int[]{1,2,3};
- 简化格式:数据类型[] 变量名 = {数据1,数据2,…}; eg: int[] arr = {1,2,3};
注:
int[] arr = 只指定长度,java会给默认值;
int[] arr = 只指定元素,java会自动计算长度; //不能即指定长度,有指定元素
//注意:简写格式,只允许在创建数组的时候使用,修改数组的时候不能使用;
使用场景
-
动态初始化:只明确元素个数,不明确具体数值,推荐使用动态初始化;
-
静态初始化:需求中已经明确了要操作的具体数据,直接静态初始化即可;
数组操作的两个常见小问题
- 索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题
- 空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常
- null:空值,引用数据类型的默认值,表示不指向任何有效对象
数组遍历
public class TestArray {
public static void main(String[] args) {
int[] arr = {11,68,27};
int sum = 0;
for (int i = 0; i < arr.length; i++) { //正向遍历,快捷键:数组名.fori
System.out.println(arr[i]); //通过索引,循环遍历数组中的数据
}
System.out.println("---------------");
for(int i=arr.length-1;i>=0;i--){ //逆向遍历,快捷键:数组名.forr
System.out.println(arr[i]);
sum += arr[i];
}
System.out.println("---------------");
System.out.println("sum="+sum);
}
}
结果:
数组求最值
/*
1.假设数组中的第一个元素为最大值
2.遍历数组,获取每一个元素,准备进行比较
3.如果比较的过程中,出现了比max更大的,让max记录更大的值
4.循环结束后,打印最大值
* */
public class TestArray {
public static void main(String[] args) {
int[] arr = {11,68,27,39,64,99};
int max = arr[0];
int min = arr[0];
for (int i = 0; i < arr.length; i++) {
if(arr[i]>max){
max=arr[i];
}
if(arr[i]<min){
min=arr[i];
}
}
System.out.println("最大值为:"+max);
System.out.println("最小值为:"+min);
}
}
结果:
数组求和
import java.util.Scanner;
public class TestArray {
public static void main(String[] args) {
int[] arr = new int[5];
int sum = 0;
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 5; i++) {
System.out.print("请输入第"+(i+1)+"个数:");
arr[i] = sc.nextInt();
}
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("数组中所有数之和为:"+sum);
}
}
结果:
数组查找
import java.util.Scanner;
public class TestArray {
public static void main(String[] args) {
int[] arr = {12,64,33,45,27,78};
int index = -1; //定义一个索引并初始化
Scanner sc = new Scanner(System.in);
System.out.print("请输入你要查找的值:");
int serchNum = sc.nextInt();
for (int i = 0; i < arr.length; i++) {
if(serchNum==arr[i]){
index=i; //遍历数组,若要查找的值与数组中的值相等,则将该值的索引赋值给index
}
}
if(index==-1){
System.out.println("你要查找的数不存在。");
}else{
System.out.println("你要查找的数的索引为:"+index);
}
}
}
结果:
案例:评委打分
import java.util.Scanner;
public class Demo1Array {
public static void main(String[] args) {
double[] arr = new double[6]; //定义长度为6的double型数组,存储6位评委的评分
double score; //定义评分score变量
Scanner sc = new Scanner(System.in);
for(int i=1;i<7;i++){
System.out.print("请输入第"+i+"位评委的打分:");
score = sc.nextInt(); //接受评委评分
if(score>100|score<0){ //判断评分是否符合标准
System.out.println("您输入的评分有误,请重新输入。");
i--; //评分有误,i-1回到for循环i+1,则i还是原值,达到重新输入的效果
}else{
arr[i-1]=score; //将平分存储入数组
}
}
double sum = arr[0];
double max = arr[0];
double min = arr[0];
//循环遍历数组,得出数组中的最大值和最小值,并求出数组中数的和
for(int i=1;i<arr.length;i++){
sum += arr[i];
if(max<arr[i]) {
max = arr[i];
}
if(min>arr[i]){
min = arr[i];
}
}
double avg = (sum-max-min)/4; //去掉最大值和最小值后的平均分
System.out.println("平均评分为:"+avg);
}
}
结果:
练习1
需求:假如小明今年第1季度的三个月中的营业额分别是{5,10,15},第二季度他计划要把第1季度中每个月的营业额都提升为2倍,请你帮小明同学计算出他第二季度的每个月营业额;
要求:
1.第二季度营业额需要使用一个新数组保存
2.在控制台中打印新数组的所有元素
/*
第二季度营业额是第一季度中每个月的2倍,则遍历
第一季度中的数并乘以2可得第二季度营业额
* */
public class TestArray {
public static void main(String[] args) {
int[] arr1 = {5,10,15};
int[] arr2 = new int[3];
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i]*2;
}
System.out.println("小明第二季度的营业额为:");
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i]+" ");
}
}
}
结果:
练习2
需求:假设小明同学本周5天的日盈利分别如下:int[] arr = {1,3,-1,5,-2},为了防止同行偷窥行业机密,小明决定将上面的实际营业额重新记录一份,这次记录的时候,把上面数组中的内容倒着记录,并将所有的负数按0记录。请你帮小明把上面的结果按小明的规则重新保存到一个新数组中,并打印出来;
/*
对数组进行逆向遍历,并判断数是否小于零,若不小于零,则
直接赋值给新数组,否则变为零后再赋值给新数组,即将原数
组的最后一个数(arr1[i=arr1.length-1])按一定规则赋值给
新数组的第一个数arr2[0=arr2.length-1-i],
arr1[i-1=arr1.length-2]赋值给arr2[1=arr2.length-1-(i-1)],
即:将原数组的下标为i的值arr1[i]赋值给新数组的下标为(arr2.length-1-i)
的值arr2[arr2.length-1-i]
* */
public class TestArray {
public static void main(String[] args) {
int[] arr1 = {1,3,-1,5,-2};
int[] arr2 = new int[5];
int t = -1;
for (int i = arr1.length - 1; i >= 0; i--) {
//if(arr1[i]<0){
// arr2[arr2.length-1-i]=0
// }else{
// arr2[arr2.length-1-i]=arr1[i];
// }
t++; //t初始值为-1,t++后,则t=0,是数组arr2从0开始遍历
if(arr1[i]<0){
arr2[t]=0;
}else{
arr2[t]=arr1[i];
}
}
System.out.println("原数组内容:");
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+" ");
}
System.out.println();
System.out.println("新数组内容:");
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i]+" ");
}
}
}
结果:
练习3
需求:已知双色球由1个蓝色球和6个红色球组成,蓝色球的范围是1–16,红色球的范围是1–33;请使用程序随机生成一组双色球并保存到数组中;然后打印出数组中的这一组数据;
import java.util.Random;
public class TestArray {
public static void main(String[] args) {
int[] arr = new int[7];
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
if(i==0){ //判断是否为第一个数
arr[i]=r.nextInt(16)+1; //第一个为蓝色球,范围为1~16
}else{
arr[i]=r.nextInt(33)+1; //后六个为红色球,范围为1~33
}
}
System.out.println("您的双色球号为:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
结果: