目录
一、简单数组了解
1、数组概念
数组是编程语言中的一种常见的数据结构,能够存储一组相同类型的数据。
2、数组的作用
存储一组相同类型的数据,方便进行数据统计和利用。(如求平均值、找最大值等)
3、数组的定义
语法
第一种:
数据类型[ ] 数组名;
数组名 = new 数据类型 [数组的长度];
//上述两步成功定义一个数组
第二种:
数据类型[ ] 数组名 = new 数据类型[数组的长度];
第三种:
数据类型[ ] 数组名 = {元素1,元素2,元素3,……,元素n};
第四种:
数组名 = new 数据类型[ ] {元素1,元素2,元素3,……,元素n};
4、各类型数组元素未赋值时的默认值情况
双精度浮点数数组中的默认值为0.0,单精度浮点数数组中的默认值为0.0f,boolean类型数组中的默认元素为false,char类型数组中的默认元素为"\u0000",整型数组中的默认元素为0。
5、思考比较
数据类型[ ] 数组名 = {元素1,元素2,元素3,……,元素n};与数组名 = new 数据类型[ ] {元素1,元素2,元素3,……,元素n};的区别:
第一种方式只能在定义数组同时赋值时使用;第二种方式可以在定义数组时直接使用,也可以先定义数组,然后再复制使用。
6、数组基本要素
标识符:也就是数组名称,本质就是一个变量名。
数组元素:也就是数组中的每一块空间存储的数据。
元素类型:也就是数组存放的数据类型。
元素下标:数组中每一个元素所处的位置就是数组元素的下标,数组元素下标都是从0开始,所以元素最大下标是数组长度-1。
7、数组的特性
数组的长度一旦定义就不能改变,除非给数组重新赋值,才能改变数组大小。
示例
import java.util.Arrays;
public class example3{
public static void main(String[] args) {
int[] asd;
asd=new int[5];
asd=new int[]{552,540,5,4,78,9,6,};
for(int i=0;i<7;i++){
System.out.print(asd[i]+" ");
}
//输出结果是:552 540 5 4 78 9 6
//asd设定长度为5,但能输出大括号内的所有元素值,包括超出数组长度的部分
System.out.println();
asd = new int[7];
for(int i=0;i<7;i++){
System.out.print(asd[i]+" ");
}
//输出结果是0 0 0 0 0 0 0
//因为数组长度的变更,原本的指向地址会改变,使用一块新的内存空间
}
}
二、数组操作
1、数组遍历
数组遍历是指将数组中的元素全部查看一遍。(多用循环)
例子
public class example3{
public static void main(String[] args) {
int[] numbers = new int[] {12,56,48,34,85};
for(int i=0;i<numbers.length;i++){
System.out.println(numbers[i]);
}
}
}
2、修改数组中元素
对数组元素进行赋值操作可改变数组元素数据值。
例子
public class example3{
public static void main(String[] args) {
int[] numbers = new int[] {12,56,48,34,85};
numbers[0]=14;//将nembers[0]的数据值改为14
for(int i=0;i<numbers.length;i++){
System.out.println(numbers[i]);
}
}
}
3、向数组中添加元素
例子
public class example3{
public static void main(String[] args) {
int[] numbers = new int[] {12,56,48,34,85};
//在numbers数组的56后面加一数据60
int[] data = new int[6];//创建新数组空间
for(int i=0;i<numbers.length;i++){
data[i]=numbers[i];//拷贝numbers数据到data中
}
data[2]=60;//添加60
for(int j=2;j<numbers.length;j++){ //补齐data后面的数据
data[j+1]=numbers[j];
}
for(int w=0;w<data.length;w++){
System.out.print(data[w]+" ");//输出
}
}
}
4、删除数组中元素
例子
public class example3{
public static void main(String[] args) {
int[] numbers = new int[] {12,56,48,34,85};
//在numbers数组中删去48
int[] data = new int[numbers.length-1];//创建新数组空间
int index=2;//48的数组下标
for(int i=0;i<index;i++){
data[i]=numbers[i];//拷贝numbers中48前的数据到data中
}
for(int j=index+1;j<numbers.length;j++){ //补齐data后面的数据
data[j-1]=numbers[j];
}
for(int w=0;w<data.length;w++){
System.out.print(data[w]+" ");//输出
}
}
}
5、数组拷贝和扩容
数组拷贝
语法
System.arrayCopy(原数组, 拷贝的开始位置, 目标数组, 存放的开始位置, 拷贝的元素个数);
例子
public class example3{
public static void main(String[] args) {
String[] awd = {"A","B","C","D","E"};
String[] asd = new String[awd.length];
System.arraycopy(awd,0,asd,0,awd.length);//将awd中的数据拷贝到asd中
for(int i=0;i<awd.length;i++){
System.out.print(asd[i]+" ");
}
//下面的代码与上面效果等同
// for(int j=0;j<awd.length;j++){
// asd[j]=awd[j];
// }
}
}
数组扩容
语法
数据类型[ ] 标识符 = Arrays.copyof(原数组, 新数组长度);
例子
import java.util.Arrays;
public class example3{
public static void main(String[] args) {
String[] awd = {"A","B","C","D","E"};
String[] newawd = Arrays.copyOf(awd,awd.length+1);//扩容数组newawd,在原有的awd中B后面加入F
// newawd={"A","B","C","D","E",null};
int index=2;
newawd[index]="F";
System.arraycopy(awd,2,newawd,3,3);
//newawd={"A","B","F","C","D","E"};
for(int i=0;i<newawd.length;i++){
System.out.print(newawd[i]+" ");
}
}
}
三、数组排序
1、定义
数组排序指的是数组中的元素按从大到小或从小到大的顺序依次排序,因此数组排序分为升序排序和降序排序两种。
2、冒泡排序学习
说明:该排序规则是每一次对数组元素进行遍历,找出这次遍历中的最大值(或最小值),在每一次遍历数组时,比较数组中两个相邻元素的大小,根据排序需要交换元素的位置,注意每遍历一遍后会去除该次选出的最大值(或最小值),后面再遍历时遍历元素数减一(一般是将选出的最值放在最后一位,下次遍历时就不用比较此处的元素),直到遍历比较的数为1时停止。
例子
public class example3{
public static void main(String[] args) {
int[] numbers = {45,96,48,12,34,50,76};//使用冒泡排序将数组元素进行升序排序
for(int i=1;i<=numbers.length;i++){ //获得遍历次数
for(int j=0;j<numbers.length-i;j++){ //循环进行比较
if(numbers[j]>numbers[j+1]){
int a=numbers[j];
numbers[j]=numbers[j+1];
numbers[j+1]=a;
}
}
}
for(int w=0;w<numbers.length;w++){
System.out.print(numbers[w]+" ");
}
}
}
输出结果是:12 34 45 48 50 76 96
3、选择排序学习
说明:该排序规则是先确定一个待定元素(一般是从数组元素第一位开始),每一次对数组元素进行遍历,在每一次遍历数组时,比较数组中两个相邻元素的大小,根据排序需要确定最大值(或最小值)的位置,每次遍历完后将选出的最值与当前的待定位置元素进行交换,交换后下次遍历的待定元素是上一次待定元素的下一元素,且每次遍历从待定元素开始,直到待定元素是最后一个元素时停止排序操作。
例子
public class example3{
public static void main(String[] args) {
int[] numbers = {45,96,48,12,34,50,76};//使用选择排序将数组元素进行升序排序
for(int i=0;i<numbers.length;i++){ //获得遍历次数
int min=i; //假定最小值为待定位置的元素
for(int j=i+1;j<numbers.length;j++){ //从待定位置后一位开始比较
if(numbers[j]<numbers[min])
min=j;
} //循环后获取最小值位置
int a=numbers[i];
numbers[i]=numbers[min];
numbers[min]=a;
}
for(int w=0;w<numbers.length;w++){
System.out.print(numbers[w]+" ");
}
}
}
4、工具类的排序操作
语法
Arrays.sort(数组名); //将数组中的元素进行升序排序
Arrays.toString(数组名); //将数组中的元素组装为一个字符串输出
例子
import java.util.Arrays;
public class example3{
public static void main(String[] args) {
int[] numbers = {45,96,48,12,34,50,76};
Arrays.sort(numbers); //发生升序排序
for(int w=0;w<numbers.length;w++){
System.out.print(numbers[w]+" ");
}
}
}
import java.util.Arrays;
public class example3{
public static void main(String[] args) {
int[] numbers = {45,96,48,12,34,50,76};
Arrays.sort(numbers); //发生升序排序
System.out.print(Arrays.toString(numbers));
}
}
Arrays.sort(数组名);的补充说明:
当对纯数字进行排序时,按数字大小进行升序排序。
当对字母进行排序时,若是单个字母的比较,按它们对应的ASCII值进行比较;若是多个字母组成的字符串,先对字符串首字母比较大小,进行第一次排序,如果出现多个字母相同的字符串,则会往后进行比较,直到比较出大小为止(如果出现 'list' 与 'lista'这样的比较情况,会把 'list' 放前面;如果出现 'listabc' 与 'listb' 比较的情况,会把 'listabc' 放前面,该代码工具排序时ASCII的比较优先级最高)。
例子
import java.util.Arrays;
public class example3{
public static void main(String[] args) {
String[] numbers={"Admire","Admit","List","Lists","Lista"};
Arrays.sort(numbers); //发生升序排序
System.out.print(Arrays.toString(numbers));
}
}
5、二分查找法
说明
二分查找法又称为折半查找,该方法每一次都会将数组从中间分为两个区间,利用中间元素与要查找的目标元素比较大小,从而确认目标元素所在的区间,依次往复执行,直到找到目标元素为止。
二分查找法只应用于已排好序的数组。
例子
public class example3{
public static void main(String[] args) {
int[] numbers = {12,35,42,52,68,74,96}; //升序排序
int target=68; //目标数
int start=0,end=numbers.length-1; //定下开头结尾
int middle = (start+end)/2; //获取中间位置
while(numbers[middle]!=target){
if(target>numbers[middle])
start=middle+1; //取右半部分找目标值
if(target<numbers[middle])
end=middle-1; //取左半部分找目标值
middle = (start+end)/2; //更新中间位置
}
System.out.println("target在数组的第"+(middle+1)+"个位置");
}
}
四、认识二维数组
1、了解数组的本质
数组从本质上来说只有一维,二维数组是指在一维数组中再放入一个一维数组,后面的三维数组、四维数组同样如此。
2、二维数组的定义
语法
数据类型 [ ] [ ] 数组名 = new 数据类型 [数组的长度] [数组的长度];
//第一个数组长度必须写入,第二个可写可不写
例子
public class example3{
public static void main(String[] args) {
int[][] numbers = new int[3][2];//定义了一个长度为3的二维数组,每一个空间中只能存放
numbers[0]=new int[]{10,20};
numbers[1]=new int[]{30,40};
numbers[2]=new int[]{50,60};
String[][]names = new String[3][];
//第二个数组长度没确定,让后面的元素输入个数能自由选择
names[0]=new String[]{"秦始皇"};
names[1]=new String[]{"汉武帝","魏武帝"};
names[2]=new String[]{"朱元璋","李世明","乾隆"};
}
}
练习引入
已知有三个班级,三个班分别由6,5,4个人,现在要实现输入三个班每人的年龄与成绩,请编写相应程序。
代码如下:
import java.util.Scanner;
public class example3{
public static void main(String[] args) {
int[][][] stu= new int[3][][];
stu[0]=new int[6][2];
stu[1]=new int[5][2];
stu[2]=new int[4][2];
Scanner sc=new Scanner(System.in);
for(int i=0;i<stu.length;i++){
int[][] infos=stu[i];
for(int j=0;j<infos.length;j++){
System.out.println("请输入年龄:");
int age=sc.nextInt();
System.out.println("请输入成绩:");
int grade=sc.nextInt();
infos[i]=new int[]{age,grade};
}
}
for(int w=0;w<stu.length;w++){
int[][] infos=stu[w];
for(int q=0;q<infos.length;q++){
System.out.println("年龄:"+infos[q][0]+";成绩:"+infos[q][1]);
//查看学生数据
}
}
}
}