一维数组

  • 基本概念

数组是相同数据类型的多个元素的容器,元素按线性顺序排列。

所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个元素外,每一个元素都有唯一的后继元素(“一个跟一个”)。

数组的操作其实就是对下标的控制,可以通过下标方式访问数组中每个元素。

  • 数组的声明
1
2
3
数据类型[]  数组名=  new   数据类型[ 元素个数 ];

数据类型 数组名[] = new 数据类型[ 元素个数 ];
  • 数组的访问

调用数组的length属性可以获取数组的长度:int len = arr.length;

可以通过下标的方式访问数组中的每一个元素。需要注意的是:数组的下标 从0开始,对于长度为n的数组,下标的范围是0-n-1。

  • 实现数组的声明和所有元素的遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Scanner input = new Scanner(System.in);
//声明数组用于存储5个整数
int[] ns = new int[15];

//循环输入15个元素
int i;
for(i=0; i<ns.length; i++){
System.out.print("请输入第"+ (i+1) +"个数: ");
ns[i] = input.nextInt();
}
//循环输出15个元素
for(i=0; i<ns.length; i++ ){
System.out.print("ns["+i+"]=" + ns[i] +"\t");
}
  • 数组元素的初始化

声明数组同时赋予初始值,方式1 – 完整版

1
2
3
数据类型[]  数组名  =  new  数据类型[]{值1,  值2,  值3,  ... ...  , 值N};
//例如,声明数组存放10,20,30,40,50这5个整数
int[] ns = new int[]{ 10, 20, 30, 40, 50};

声明数组同时赋予初始值,方式2 – 简化版

1
2
3
数组类型[]  数组名  =  {值1, 值2,值3, ... ... ,   值N};
//例如:
int[] ns = { 10, 20, 30, 40, 50};

一维数组常见算法

  • 求数组元素中的最大值与最小值.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//找出数组元素中的最大值
//1 声明数组并赋予初始值
int[] ns = {-1,-35,-24,-7,-6,-95,-28,-47,-56,-73};

//2 设最大值默认为数组首元素值
int max = ns[0]; //思考,为什么不设max最大值的初始值是0呢?
//答:如果每个数组元素值都是负数,0比任意一个负数都大
//3 循环访问数组的每个元素与最大值做对比
int i;
for( i=0 ; i<ns.length; i++){
//当数组元素值比最大值max大时,max赋值这个数组元素
if( ns[i] > max ){
max = ns[i];
}
}
System.out.println("最大值是:"+max);

//找出数组元素中的最小值.
int min = ns[0];
for( i=0 ; i<ns.length; i++){
//当数组元素值比最小值min小时,min赋值这个数组元素
if( ns[i] < min ){
min= ns[i];
}
}
System.out.println("最小值是:"+min);
  • 数组元素的删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Scanner input = new Scanner(System.in);
//1 初始数组元素
int[] ns= { 8,1,6,3,2,7,9 };
int i;//循环计数器,控制数组元素访问的下标

System.out.println("删除元素前>>>");
for( i=0; i<ns.length; i++){
System.out.print("ns["+i+"]="+ns[i]+"\t");
}

//2 输入删除的这个数
System.out.print("\n请输入您要删除的数据:");
int delNum = input.nextInt();
//3 找到删除的这个数在数组的那个元素存储
for( i=0; i<ns.length; i++){
if( ns[i] == delNum)//找到了 i就是删除点
break;//找到即停止
}

//附加功能,强化删除元素不存在时的判断
if( i==ns.length)
System.out.println(delNum+"不在数组存储数据内!");
else{
//记录删除点下标
int delIndex = i;
//4 实现删除
for( ; delIndex<ns.length-1; delIndex++ ){
ns[ delIndex ] = ns[ delIndex+1 ]; //当前元素,赋值下一个元素。逐个向前移动覆盖
}
//5 将数组尾元素清0
ns[ ns.length-1 ] =0;
//6 打印删除后的结果
System.out.println("删除元素后>>>");
for( i=0; i<ns.length-1; i++){
System.out.print("ns["+i+"]="+ns[i]+"\t");
}
}
  • 数组元素的添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Scanner input = new Scanner(System.in);
//1 声明并初始化有序的数组元素
int[] ms = {1,3,5,7,11, 0 };
int i;
System.out.println("--【插入数据前】------------------------------------------------------------");
for(i=0; i<ms.length-1; i++){
System.out.print("ms["+i+"]="+ms[i]+"\t");
}
System.out.println("");
//2 输入您要插入的数据
System.out.print("请输入新数据:");
int newNum = input.nextInt();//newNum = 12;
//3 找到插入点:
for( i=0; i<ms.length; i++){
//ms[0] >=12 1>=12 不成立
//ms[1] >=12 3>=12 不成立
//ms[2] >=12 5>=12 不成立
//ms[3] >=12 7>=12 不成立 i++
//ms[4] >=12 11>=12 不成立 i++ i变5
//ms[5] >=12 0>=12 不成立 i++ i变6
if( ms[i] >= newNum )//找到比新数据大的这个元素即停止
break;
}
//保留插入点下标: 当新数据比数组内已有元素都大时,插入点i=6,此时需要回归减一
int charIndex = i==ms.length? i-1 : i;
//4 挪位置
int end;
for( end=ms.length-1; end>charIndex; end--){
ms[end] = ms[end-1];
}
//5 插入
ms[charIndex] = newNum;

System.out.println("--【插入数据后】------------------------------------------------------------");
for(i=0; i<ms.length; i++){
System.out.print("ms["+i+"]="+ms[i]+"\t");
}
  • 数组元素的修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Scanner input = new Scanner(System.in);
//修改数组内已有元素
//1 声明并初始化数组元素
String[] names = {"aa","bb","CC","dd","ee"};
System.out.println("修改前-----------------------------");
int i;
for(i=0; i<names.length; i++){
System.out.print("names["+i+"]="+ names[i] +"\t");
}
System.out.println("");

//2 请输入旧名称
System.out.print("请输入名称:");
String oldName = input.next();
//3 请输入新名称
System.out.print("请输入新名称:");
String newName = input.next();

//4 查找旧名称在数据的什么位置上,找到时保留修改点下标
for(i=0; i<names.length; i++){
//循环遍历每一个数组元素,当这个元素的值和旧名称一致时找到了,即停止
if( oldName.equals(names[i]) ){
break;
}
}
//5 赋新值
if( i<names.length ){
//找到修改
names[i] = newName;
System.out.println("修改后");
for(i=0; i<names.length; i++){
System.out.print("names["+i+"]="+ names[i] +"\t");
}
}else{
System.out.println("您输入的元素不存在!");
}
  • 输入一个正整数,统计每个数字出现的次数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Scanner input = new Scanner(System.in);
System.out.print("请输入一个整数:");
int n = input.nextInt();

//声明数组,存储0~9数字出现的次数
int[] ci = {0,0,0,0, 0,0,0,0, 0,0};

int yu;
//循环拆分这个输入的数字
while(n!=0){
yu = n%10;
ci[ yu ] ++;
n=n/10;
//System.out.println("尾数:"+yu+",下次计算的数:"+n);
}
System.out.println("数0\t数1\t数2\t数3\t数4\t数5\t数6\t数7\t数8\t数9\t");
int i;
for(i=0; i<ci.length; i++){
System.out.print(ci[i]+"次\t");
}