注:本节教材内容,与上期推送的《预备知识:Java程序设计基础->数组(一)》为一个章节。
回顾上节内容,请点击:原理:预备知识:Java程序设计基础->数组(一)
实验流程
5.冒泡序算法。
数组排序最常用的两种排序方法是选择排序和冒泡排序。
(1).冒泡排序:依次比较相邻的两个数,将小数放在前面,大数放在后面。
(2).选择排序:每一次从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序数列的最后,直到全部待排序的数据元素排完。
我们以冒泡排序算法来给大家举例说明:假定有一个数组为int[] a = {12, 34, 23, 56, 69, 38, 47};则冒泡排序按如下顺序进行:
(1).第一轮:比较12和34,位置不变,比较34和23,交换位置,比较34和56,位置不变。这样完成第一轮后我们可以将本数组中的最大值69的位置放到数组的最后。完成这一轮后,数 组的顺序变为:{12,23,34,56,38,47,69}。
(2).第二轮:比较12和23,位置不变,比较23和34,位置不变,比较34和56,位置不变,比较56和38,位置交换,最后将本轮的次大值56放在了数组倒数第2的位置上。
(3).第三轮:以此类推,最后将数组的值按从小到大的顺序排列。当然,我们也可以将数组的值从大到小排列,其原理是一样的,只要在两两比较时将小值交换到后面即可。下列代码为大家演示了冒泡排序算法的具体实现,务必认真理解。
int[] a = {12, 34, 23, 56, 69, 38, 47}; //外循环,指定比较的轮数,一共是长度-1轮 for (int i=0; i<a.length-1; i++) { //内循环,将数组的值进行一一比较 for (int j=0; j<a.length-i-1; j++) { if (a[j] > a[j+1]) { int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } }
//输出排序后的数组进行验证 for (int i: a) { System.out.println(i); } |
6.数组的动态扩展。
我们知道,在Java中,数组是固定长度不能扩展的。但是在现实情况中,动态地扩展数组以适应程序的要求是非常常见的。比如我们在WoniuATM中,要利用数组来完成用户的注册,但是我们并不知道具体的开户注册数量,所以无论我们定义何种固定长度的数组,都不能达到自适应的目的。如果数组定义得太短,不够用,定义得太长,则浪费存储空间,这是其必要性。先来看看Java中数组动态扩展的原理:
(1).定义数组A,然后定义数组B,数组B的长度为A的长度+1
(2).将数组A的值全部复制给B
(3).将数组B的地址赋值给数组A,即A=B即可。
通过上述原理的描述,我们可以得知,其实质并不是将数组A直接加长,而是新增一个数组,将新数组的地址赋值给原数组名,进而模拟出动态扩展的功能,来看看具体代码实现:
int[] a = {11, 22, 33, 44}; System.out.println("数组a的长度为:" + a.length); int[] b = new int[a.length+1]; for (int i=0; i<a.length; i++) { b[i] = a[i]; } a = b; System.out.println("数组a的长度为:" + a.length); |
7.多维数组。
前面所学的都是一维数组的操作,在实际应用中,我们还有可能使用二维数组,三维数组,甚至N维数组。其实多维数组不难理解,就是数组的数组,比如二维数组,那么里面保存的每一个值就是一个一维数组,如下例所示:
int[][] twoDim = new int[4][]; twoDim[0] = new int[5]; twoDim [1] = new int[5]; |
在概念上可以用下图表示,行是一维,列是二维:
下列代码展示了二维数组的定义,赋值及遍历等基本操作:
public void twoDimension() { //可以在定义时不指定第二维的长度 int twoDim[][] = new int[4][]; //第二维的长度可以不固定,就不规则二维数组 twoDim[0] = new int[1]; twoDim[1] = new int[2]; twoDim[2] = new int[3]; twoDim[3] = new int[4]; //对数组进行赋值 int value = 1; for (int i=0; i<twoDim.length; i++) { for (int j=0; j<i+1; j++) { twoDim[i][j] = value; value ++; } } //将数组的值输出 for (int i=0; i<twoDim.length; i++) { for (int j=0; j<i+1; j++) { System.out.print(twoDim[i][j]); System.out.print(" "); } System.out.println(); } } |
上述代码的输出结果为:
1 2 3 4 5 6 7 8 9 10 |
多维数组也可以直接初始化,相当于把每一维初始化列表用它自己的{}括起来即可,如:
int m[][] = { {0*0,0*1,0*2,0*3}, {1*0,1*1,1*2,1*3}, {2*0,2*1,2*2,2*3}, {3*0,3*1,3*2,3*3} }; |
三维数组或N维数组的操作与上述代码类似:
publicvoid threeDimension(){ int threeD[][][] = new int [3][4][5]; int i,j,k; // 对数组元素赋值 for(i=0; i< 3; i++) for(j=0; j< 4; j++) for(k=0; k< 5; k++) threeD[i][j][k] = i*j*k; // 访问数组元素并打印 for(i=0; i< 3; i++){ for(j=0; j< 4; j++){ for(k=0; k< 5; k++) System.out.print(threeD[i][j][k]+ ""); System.out.println(); } System.out.println(); } } |
8.ArrayList对象。
由于Java中数组的一些固有特性,限制了我们对数组的灵活运用。所以在Java中,我们可以使用ArrayList来代替数组的使用。ArrayList列表对象为我们提供了更加灵活的操作,比如长度自动增长,可以随时添加数据,遍历数据,删除数据等。下面我们来看看ArrayList的常用操作:
package com.woniuxy.java.basic; //注意,要使用列表,必须导入相应的包s import java.util.ArrayList; import java.util.List;
public class ArrayListDemo { public static void main(String[] args) { //定义列表对象,长度不限,其保存的数据类型为字符串,注意声明方式 //之所以使用List来定义ArrayList,是因为List统一了接口 List<String> users = new ArrayList<String>(); //调用列表对象的add方法,往列表中添加数据 users.add("woniu"); users.add("admin"); users.add("hello"); users.add("qiang"); //利用for循环遍历该列表对象 for (int i=0; i<users.size(); i++) { System.out.println(users.get(i)); } users.add("cheng");//继续添加一条数据 users.remove(2);//删除第3条数据 users.remove("cheng");// remove的重载方法,删除cheng这条数据 //使用contains来判断是否仍然包含数据cheng if (users.contains("cheng")) { System.out.println("删除未成功."); } else { System.out.println("删除成功."); } //继续遍历输出,以确认上述操作的结果 for (int i=0; i<users.size(); i++) { System.out.println(users.get(i)); } } } |
思考练习
1.自学并完成选择排序和二分查找算法的思路和代码实现。
2.如何完成数组的删除?或对数组指定位置的值进行删除?
下周推送:核心实验:实现WoniuATM的注册与登录