Java之数组
- 数组
JAVA中,程序 = 算法 + 数据结构;
像if、if-else、switch、循环解决的都是流程问题,即算法问题。
所谓数据结构,简单说就是把数据按照特定的某种结构来保存,设计合理的数据结构是解决问题的前提。数组就是最基本的一种数据结构。
2.1什么是数组
数组是多个相同类型数据的组合,实现对这些数据的统一管理
2.2数组的定义
数组的声明
数据类型[] 数组名;
数组的初始化
3种方式:
int[] ary = {1,2,3};
int[] ary = new int[length]
int[] ary = new int[]{1,2,3}
数组的访问:访问长度:通过length属性访问
访问元素:通过下标访问:例如 array[0]。
数组的线性特性:
所谓线性结构是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个元素外,每一个元素都
有唯一的后继元素(“一个跟一个”)
可以通过元素所在位置的顺序号(下标)做标识来访问每一个元素(下标从0开始,最大到元素个数-1)
遍历数组:
举个栗子:
遍历数组元素,正序输出
遍历数组元素,逆序输出
数组的访问,遍历
public class ArrayDemo01 {
public static void main(String[] args) {
/*
- 创建一个数组
/
// int[] ary = {1,2,3,4};
/ - 数组的访问:
- 访问数组的长度 :调用数组中的length属性获取int类型的长度值
/
// int len = ary.length;
// System.out.println(len);
/
*访问数组的元素 - 通过下标访问数组的元素
- 访问数组的元素:
- 1.查看元素值
- 2.对元素重新赋值
/
int[] ary = new int[4];
//对数组中第一个元素进行重新赋值
//查看元素中此时的值
System.out.println(ary[0]);
ary[0] = 1;
System.out.println(Arrays.toString(ary));
/ - 对ary数组进行遍历,输出每个元素的值
/
for(int i=0;i<ary.length;i++){
//循环一次代表访问了一个元素
System.out.println(ary[i]);
}
}
}
遍历数组元素,实现逆序输出
public class ArrayDemo02 {
public static void main(String[] args) {
/ - 实现数组元素的逆序输出
/
int[] ary = {12,3,54,63,4,6,7};
for(int i=ary.length-1;i>=0;i–){
System.out.println(ary[i]);
}
}
举个栗子:
定义一个长度为10的数组,元素随机生成,找出数组中元素的最大值
public class MaxValueDmeo {
public static void main(String[] args) {
/ - 定义一个长度为10的int数组,为每个元素重新
- 赋值(0-100间的随机数),求出数组中的最大值
- 步骤:
- 1.定义一个数组
- 2.为数组中的元素重新赋值
- 3.找出数组中的最大值
*/
int[] ary = new int[10];
//为每个元素重新赋值 - 遍历
for(int i=0;i<ary.length;i++){
ary[i] = (int)(Math.random()*100);
}
System.out.println(Arrays.toString(ary));
//取出最大值
int max = 0;
for(int i=0;i<ary.length;i++){
max = max>ary[i]?max:ary[i];
}
System.out.println(“数组中的最大值是:”+max);
}
2.3 数组的复制
要求:有2个int数组
int[] ary1 = {1,2,3…12};
int[] ary2 = new int[5];
现要求ary1中1-5下标的元素复制到ary2的3-7位置,如何实现?
**
1.System.arrayCopy(…)
**
-arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
注意点:
调用此方法实现数组复制时,复制的length的值需要注意,此长度决定的复制的最后一个元素的下
标不要越界,否则会报ArraryIndexOutOfBoundsException
public class ArrayCopyDemo {
public static void main(String[] args) {
//定义一个源数组,一个目标数组
int[] ary1 = {12,2,34,5,6,7,89,20};
int[] ary2 = new int[10];
/*
- 将ary1中2-7元素复制到ary2中下标从3-7
*/
System.out.println(Arrays.toString(ary2));
System.arraycopy(ary1, 1, ary2, 3, 5);
System.out.println(Arrays.toString(ary2));
}
}
2.Arrarys.copyOf(…)
类型[ ] newArray = Arrays.copyOf (类型[ ] original , int newLength ) :数据类型[]:此方法通常用于实现数组的扩容
注意点:
- 此扩容并非真正的扩容
- newlength值>源数组长度以及 小于源数组长度时产生的效果
public class CopyOfDemo {
public static void main(String[] args) {
/*
*copyOf(original,int newlength)
*/
int[] ary = {12,34,4,5,13,65};
//实现ary数组的扩容,扩容后的长度为8
// ary = Arrays.copyOf(ary, 8);
ary = Arrays.copyOf(ary, 4);
System.out.println(Arrays.toString(ary));
}
}
举个栗子:
- 找出数组元素中的最大值并将找出的最大值放在数组最后一个元素的下一个位置。
a) 步骤:
i. 1.找出数组中的最大值
ii. 2.实现数组扩容
iii. 3.将最大值放到扩容后的数组的最后一位
/*
- 找出数组中的最大值并将其放到扩容后的数组的
- 最后一位
*/
public class CopyOfMaxValDemo {
public static void main(String[] args) {
//找出数组中的最大值
int[] ary = {12,34,6,7,87,90,45};
int max = 0;
for(int i=0;i<ary.length;i++){
max = max>ary[i]?max:ary[i];
}
System.out.println(“最大值是:”+max);
//实现数组的扩容
ary = Arrays.copyOf(ary, ary.length+1);
//将最大值放到数组的最后
ary[ary.length-1] = max;
System.out.println(Arrays.toString(ary));
}
}
举个栗子:
创建一个长度为10的数组,数组内放置10个0-99之间的随机整数作为数组元素。要求查询出数组中的最小值,并打印显示在界面上。然后,将数组的长度扩容为11,将查询到的最小值记录为数组的第一个元素,并打
印扩容后的数组的内容
:源数组: 12,3,5,7,8,9
预期结果: 3,12,3,5,7,8,9
步骤:
- 创建数组并为其元素赋值
- 找出数组中的最小值
- 对数组扩容,并将查询到的最小值放到扩容后数组的第一个位置,其他元素顺序后移
/*
- 创建一个数组,找出最小值,对数组进行扩容
- 将查找到的最小值放到扩容后数组的第一个位置
- 其他元素顺序后移
*/
public class CopyOfMinDemo {
public static void main(String[] args) {
//1.创建数组并为其元素赋值
int[] ary = new int[10];
for(int i=0;i<ary.length;i++){
ary[i] = (int)(Math.random()*100);
}
System.out.println(Arrays.toString(ary));
//找出最小值并打印
int min = ary[0];
for (int i = 1; i < ary.length; i++) {
min = min<ary[i]?min:ary[i];
}
System.out.println(“最小值是:”+min);
//实现数组的扩容并将最小值放到扩容后的第一个位置,其他元素顺序后移
ary = Arrays.copyOf(ary, ary.length+1);
//先将扩容后的元素后移,后完成赋最小值操作
int[] dest = new int[ary.length];
System.arraycopy(ary, 0, dest, 1, ary.length-1);
System.out.println(Arrays.toString(dest));
//将最小值赋给第一个位置
dest[0] = min;
System.out.println(Arrays.toString(dest));
}
}
2.4数组的排序
所谓排序,是指将数组元素按照从小到大或从大到小的顺序重新排列;
要想对数组进行排序,此时我们需要采用排序算法。
排序算法:冒泡排序 选择排序 快速排序 插入排序。。。。
常用的排序算法有:冒泡排序、选择排序等。
冒泡排序:
比较相邻的元素,如果违反最后的排序准则,则交换
- 比较时既可以采用"下沉"的方式(降序),也可以采用"上浮"的方式(升序)
排序的实现原理:
数组中的元素两两进行比较,如果二者的大小违反最后的排序规则,那么二者交换位置。
举个栗子:
1.用冒泡排序将数组中的最大值选出
2.对一个数组进行升序排列
用冒泡排序将数组中的最大值选出
/*
-
冒泡排序算法
/
public class BubbleSortDemo {
public static void main(String[] args) {
int[] ary = {23,1,34,7,6,43,0,22};
//对此数组进行一次冒泡排序,找出最大值
//冒泡排序算法的代码实现
System.out.println(Arrays.toString(ary));
for(int i=0;i<ary.length-1;i++){
//比较相邻元素
if(ary[i]>ary[i+1]){
//位置交换
int tmp = ary[i];
ary[i] = ary[i+1];
ary[i+1] = tmp;
}
}
System.out.println(Arrays.toString(ary));
}
}
对数组使用冒泡排序实现升序排列
/ -
对数组使用冒泡排序进行升序排列
*/
//控制冒泡排序调用的次数
System.out.println(Arrays.toString(ary));
for(int i=0;i<ary.length-1;i++){
//冒泡排序的代码实现
for(int j=0;j<ary.length-1-i;j++){
if(ary[j]>ary[j+1]){
int tmp = ary[j];
ary[j] = ary[j+1];
ary[j+1] = tmp;} }
}
System.out.println(Arrays.toString(ary));
}
简单选择排序:
从0下标开始,依次和后面每个元素比较,小的往前放,第一次完毕,最小值出现在了最小下标处
举个栗子:
1.用选择排序将数组中的最小值选出
2.对一个数组进行升序排列
简单选择排序的代码实现
/*
- 选择排序
/
public class ChooseSortDemo {
public static void main(String[] args) {
//对一个数组使用一次选择排序选出最小值
int[] ary = {23,87,34,7,6,43,0,22};
System.out.println(Arrays.toString(ary));
//使用选择排序
for(int i=1;i<ary.length;i++){
//拿第一个元素和i指向的元素进行比较
if(ary[0]>ary[i]){
int tmp = ary[0];
ary[0] = ary[i];
ary[i] = tmp;
}
}
System.out.println(Arrays.toString(ary));
}
用选择排序对数组进行升序排列
/ - 使用选择排序对数组进行升序排列
*/
System.out.println(Arrays.toString(ary));
//i代表比较的固定一方的下标
for(int i=0;i<ary.length-1;i++){
//j代表比较的另一方的下标
for(int j=i+1;j<ary.length;j++){
if(ary[i]>ary[j]){
int tmp = ary[i];
ary[i] = ary[j];
ary[j] = tmp;
}
}
}
System.out.println(Arrays.toString(ary));
}