Java数组
在开始之前,提一个十分重要的一点:注意:
在给数组分配内存空间时,必须指定数组能够存储的元素来确定数组大小。创建数组之后不能修改数组的大小,可以使用length属性获取数组的大小。在java数组中,数组只有length属性,并没有字符串的length()方法!!!
学习Java少不了对数组的学习,也就是说,从这节开始,我们的学习难度慢慢增加,代码思维更加复杂。
什么数组: 数组是由相同类型的若干项组成的一个数据集合,数组中的每个数据称为元素。
数组声明格式:(3种)
1、数据类型[] 数组名称 = new 数据类型[数组大小];
2、数据类型[] 数组名称 = new 数据类型[]{数组元素};
3、数据类型[] 数组名称 = {数组元素};
数组包括 一维数组和多维数组,在这里说一维数组和二维数组。
一、一维数组
一维数组的定义和初始化:
int[] arr = new int[5]; //初始化一个大小为5的一个一维数组。
int[] arr = new int[]{1,2,3,4,5}; //初始化一个大小为5的一个一维数组,里面的内容为1,2,3,4,5。
int[] arr = {1,2,3,4,5}; //初始化一个大小为5的一个一维数组,里面的内容为1,2,3,4,5。
注:具体要使用什么方式初始化,要看题目具体的要求,不做要求的话,个人建议使用第一种,可以自己手动输入里面的元素,也可以进行插入操作。
例子1:用一个一维数组存储元素并用循环将其输出(注意,数组不能直接输出名字,这样只是输出它指向的地址)
1 package day04; 2 3 public class exer2 { 4 public static void main(String[] args) { 5 String[] a = new String[] {"Nike背包","Adudas运动衫","李宁运动鞋","Kappa外套","361°腰包"}; 6 System.out.println("本次活动特价商品有:"); 7 for(int i = 0;i<a.length;i++) { 8 System.out.println(a[i]); 9 10 } 11 12 /*System.out.println(a);*/ 13 14 } 15 16 }
数组中我们常用的方法有:
1、数组排序方法 java.util.Arrays.sort();
例子:初始化一个一维数组,插入一个元素进行排序。
1 package day04; 2 3 import java.util.Scanner; 4 5 public class exer5 { 6 // {"a","c","u","b","e","p","f","z"}; 7 public static void main(String[] args) { 8 Scanner sc = new Scanner(System.in); 9 String[] s = new String[9]; 10 s[0] = "a"; 11 s[1] = "c"; 12 s[2] = "u"; 13 s[3] = "b"; 14 s[4] = "e"; 15 s[5] = "p"; 16 s[6] = "f"; 17 s[7] = "z"; 18 19 System.out.print("元字符序列:"); 20 for(int i =0;i<s.length;i++) { 21 System.out.print(s[i]+" "); 22 } 23 24 System.out.println(); 25 System.out.print("待插入的字符是:"); 26 String a = sc.next(); 27 28 s[8] = a; 29 java.util.Arrays.sort(s); 30 31 System.out.print("排序后的序列:"); 32 for(int i =0;i<s.length;i++) { 33 System.out.print(s[i]+" "); 34 } 35 36 37 38 39 40 41 42 } 43 44 }
2、数组转换成字符串的方法 Array.toString();
例子:从控制台输入5名学生的成绩,用一维数组接收并且将其进行降序排序。
1 package day04; 2 3 import java.util.Scanner; 4 5 public class exer2_4 { 6 public static void main(String[] args) { 7 8 int[] stu = new int[5]; 9 Scanner sc = new Scanner(System.in); 10 System.out.print("请输入五名学员的成绩:"); 11 for(int i = 0;i<stu.length;i++) { 12 int a = sc.nextInt(); 13 stu[i] = a; 14 } 15 System.out.println("此时的学生成绩为:"); 16 System.out.println(java.util.Arrays.toString(stu)); 17 18 for(int x = 0;x<stu.length;x++) { 19 for(int y = x;y<stu.length;y++ ) { 20 if(stu[x]<stu[y]) { 21 int temp = stu[y]; 22 stu[y] = stu[x]; 23 stu[x] = temp; 24 } 25 } 26 } 27 System.out.println("排序后的学生成绩为:"); 28 System.out.println(java.util.Arrays.toString(stu)); 29 30 31 } 32 33 }
输出结果:
3、数组复制方法
System.arraycopy(原数组名称,从原数组哪个地方开始复制,目标数组名称,从目标数组哪个位置开始复制,复制的长度);
1 package homework; 2 3 public class ArrayDemo4 { 4 5 public static void main(String[] args) { 6 /* 7 *数组操作的方法 8 * 9 */ 10 11 //数组方法---数组复制 System.arraycopy(原数组名称,从原数组哪个地方开始复制,目标数组名称,从目标数组哪个位置开始复制,复制的长度); 12 int a1[] = new int[] {12,32,43,5,4,43,2}; 13 int a2[] = new int[] {11,22,33,44,55,66}; 14 15 System.arraycopy(a1, 3, a2, 1, 3); 16 17 for(int i = 0;i<a2.length;i++) { 18 System.out.print(a2[i]+" "); //11 5 4 43 55 66 19 } 20 System.out.println("--------------------"); 21 22 //数组排序 java.util.Arrays.sort(数组名称); 23 int a3[] = new int[] {21,43,54,4,345,65,23,1,32}; 24 java.util.Arrays.sort(a3); 25 for(int i = 0;i<a3.length;i++) { 26 System.out.print(a3[i]+" "); 27 } 28 29 30 31 } 32 33 }
二、二维数组
二维数组的定义和初始化:
1、int[][] array = {{1,2,3},{4,5,6}};
2、int[][] array = new int[][]{{1,2,3},{4,5,6}};//数组的个数由后面初始化的实体给出
3、int[][] array = new int[2][3];
注意:如果采用第三种的方式初始化,赋值不能直接在后面添加,要利用for循环嵌套进行赋值。
例子:循环输入顾客商品价格,并且判断有几个商品可以打折。
1 package day04; 2 3 import java.util.Scanner; 4 5 public class exer2_5 { 6 public static void main(String[] args) { 7 int count = 0; 8 float[][] mans = new float[3][3]; 9 Scanner sc = new Scanner(System.in); 10 for(int i = 0;i<3;i++) { 11 System.out.println("请输入第"+(i+1)+"个人购物的三件商品的价格:"); 12 for(int j = 0;j<3;j++) { 13 float a = sc.nextFloat(); 14 mans[i][j] = a; 15 if(a>300) { 16 count++; 17 } 18 } 19 System.out.println("第"+(i+1)+"个人共有"+count+"件商品享受8折优惠!"); 20 count = 0; 21 22 } 23 24 25 26 27 28 } 29 30 }
三、数组实现冒泡排序、选择排序
1、冒泡排序
1 package day04; 2 3 public class MaoPao { 4 public static void main(String[] args) { 5 //数组 6 int[] arr = {5,3,7,2,6,7,6,5,4,1,9,8}; 7 //外部循环 8 System.out.println("开始第1次遍历对比"); 9 for(int i=0;i<arr.length-1;i++){ 10 //相连两个数的索引是利用内部循环 11 for(int index=0;index<arr.length-1-i;index++){ 12 //同样利用中间变量,注意区分与选择排序的区分 13 if(arr[index]>arr[index+1]){ 14 int temp=arr[index]; 15 arr[index]=arr[index+1]; 16 arr[index+1]=temp; 17 } 18 } 19 System.out.println(java.util.Arrays.toString(arr)); 20 System.out.println("开始第"+(i+2)+"次遍历对比"); 21 } 22 System.out.println(java.util.Arrays.toString(arr)); //Arrays.toString() 返回指定数组的内容的字符串表示形式。 23 } 24 25 }
冒泡排序是相邻的两两进行比较,如果前一个大于后一个,两两交换位置,使得最终数组成升序的顺序排序。
2、选择排序
1 package day04; 2 3 public class Choice { 4 public static void main(String[] args) { 5 // 数组 6 int[] arr = { 5, 3, 7, 2, 6, 7, 6, 5, 4, 1, 9, 8 }; 7 // 第一次循环,是确定一个数依次和后面数的比较的数。 8 for (int i = 0; i < arr.length - 1; i++) { 9 // 这个是和第一个数的比较的数 10 for (int j = i + 1; j < arr.length; j++) { 11 // 定义一个临时的变量,用来交换变量 12 int temp; 13 if (arr[i] > arr[j]) { 14 temp = arr[i]; 15 arr[i] = arr[j]; 16 arr[j] = temp; 17 } 18 System.out.println("arr["+i+"]="+arr[i]); 19 System.out.println("arr["+j+"]="+arr[j]); 20 System.out.println(); 21 22 } 23 } 24 // 打印最后的排序结果 25 System.out.println(java.util.Arrays.toString(arr)); 26 } 27 28 }
选择排序是由一个开始与所有的进行比较,如果有比它小的,交换位置,然后第二个与后面的进行比较,如此比下去,进行交换,使得最终数组成升序的顺序进行排序
四、For循环进阶
利用for循环,实现较为复杂的图形,更好的理解for循环的执行过程。
例子1、实现正直角三角形,手动输入三角形的高,每一行为奇数
1 package day04; 2 3 import java.util.Scanner; 4 5 public class exer2_1 { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 System.out.print("输入直角三角形的高:"); 9 int height = sc.nextInt(); 10 for(int i = 0;i<height;i++) { 11 for(int j = 0;j<2*i+1;j++) { 12 System.out.print("*"); 13 } 14 System.out.println(""); 15 } 16 } 17 }
运行结果:
例子2、实现倒直角三角形,手动输入三角形的高,每一行为奇数
1 package day04; 2 3 import java.util.Scanner; 4 5 public class exer2_2 { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 System.out.print("输入直角三角形的高:"); 9 int height = sc.nextInt(); 10 for(int i = 0;i<height;i++) { 11 for(int j = i;j<height;j++) { 12 System.out.print("*"); 13 } 14 System.out.println(""); 15 } 16 } 17 18 }
运行结果:
例子3、实现正等腰三角形,手动输入三角形的高,每一行为奇数
1 package day04; 2 3 import java.util.Scanner; 4 5 public class exer2_3 { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 System.out.print("输入直角三角形的高:"); 9 int height = sc.nextInt(); 10 for (int i = 0; i < height; i++) { 11 for (int j = 0; j < height - i - 1; j++) { 12 System.out.print(" "); 13 } 14 for (int k = 0; k < (i * 2 + 1); k++) { 15 System.out.print("*"); 16 } 17 System.out.println(""); 18 } 19 20 } 21 22 }
运行结果: