Java 快速入门练习(4)

2019-04-16 20:59

}

} // 输出原始的数组

ibs.sort();//调用排序方法 System.out.println(\排序后的输出\ for(int i=0;i

public void sort(){ for(int i = 1;i < testArray.length; i++){ for(int j = testArray.length-1;j >= i; j--) if(testArray[j] < testArray[j-1]) { int temp = testArray[j-1]; testArray[j-1]= testArray[j]; testArray[j]= temp; } } }

testArray是一个int数组引用变量,它是一个实例变量,其作用域为整个实例。testArray有一个private修饰符,表明这是一个私有变量,只能在类内部访问。

注意这里的sort方法,由于它不是静态方法,调用的形式为: 对象引用.方法(参数)

范例5-8中,首先调用构造方法创建了一个IntBubbleSort实例ibs: IntBubbleSort ibs = new IntBubbleSort(); 再由ibs调用sort方法: ibs.sort(); //调用排序方法

冒泡算法是由双重for循环具体实现的,具体见sort方法中的代码。

实验5.4.14: (P)int数组的选择排序

模仿范例5-8写一个IntSelectionSort.java程序,采用选择排序(Selection Sort)算法实现int数组的排序。选择排序法是一个很简单的算法。其原理是首先找到数据清单中的最小的数据,然后将这个数据同第一个数据交换位置;接下来找第二小的数据,再将其同第二个数据交换位置,以此类推。

算法示例:

3 1 1 1 1 1 1 1 6 6 2 2 2 2 2 2 2 2 6 3 3 3 3 3 1 3 3 6 4 4 4 4 5 5 5 5 5 5 5 5 4 4 4 4 6 6 6 6 8 8 8 8 8 8 8 7

16

7 7 7 7 7 7 7 8

图5.8 选择排序(Selection Sort)算法说明

实验5.4.15: (I)数组的复制

如何将整个数组的值复制给另一个数组呢?或许会用如下语句:

double[] b = a;

来实现将数组a的内容拷贝到数组b中,虽然这是有效的代码,但并不能得到我们想要的结果。为了能够复制一个数组,要用for循环对数组中的每一个元素都进行操作。见如下的代码片断:

// 创建一个和数组a相同长度的数组b double[] b = new double[a.length];

// 设定数组b中每个元素的值等于数组a中每个元素的值 for (int i=0; i

范例5-9示范了进行数组复制的方法,预测其运行结果:

_____________________________________________________________________________

程序清单5-9:ArrayCopy.java

import java.io.*;

public class ArrayCopy {

public static void main(String[] argv) { // create a new integer array int N = 12; // length of array int[] array1 = new int[N]; System.out.print(\ // assign some arbitrary values to the array elements for (int i=0; i

for (int i=0; i

System.out.println(\ // Create a copy (?) of array1 and print it out System.out.print(\

int[] array2 = array1; // \

17

for (int i=0; i

System.out.println(\ // Create a copy (?) of array1 individual elements and print it out System.out.print(\

int[] array3 = new int[array1.length]; for (int i=0; i

System.out.println(\ // Modify an element of array1 and see what else changes. System.out.println(\ array1[3] = 999;

System.out.println(\ System.out.println(\ System.out.println(\ }

} // ArrayCopy.java

编译,运行范例5-9,比较程序运行结果是否和预测输出相同。若相同,说明对数组的理解比较到位,否则,仔细阅读下面的解释。

数组间赋值语句:

Java中,对于基本数据类型变量,double b = a 实现的是将a的值赋给b。数组则不同,b = a的含义是b和a引用的是同一个数组,因此对b的一系列操作等同于对a的。数组是引用数据类型,也就是说他们是按引用处理的;而int、double、boolean这些原始数据类型,是按值处理的。例如,int[] list={1,2,3}中的数组{1,2,3}是放在计算机内存的某个地方的,用“=”运算符将数组对象指定给数组引用变量list。

注意,用new创建的对象,包括数组,都是引用数据类型。图5.8说明了使用数组间赋值语句的结果。先定义数组a,再将a赋值给数组b,其结果是它们会指向同一组数据,b并没有创建和a 一样的副本。

18

图5.9 数组间赋值语句

数组的比较:

注意,不可以用==来比较两个数组的元素值是否相等,==使用于对象比对时,是用来比对两个对象名称是否引用自同一个对象。范例5-10是这个概念的实例示范。

程序清单5-10:TestArrayValue.java public class TestArrayValue {

public static void main(String[] args) { int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = {1, 2, 3, 4, 5};

int[] tmp = arr1;

System.out.println(arr1 == arr2); System.out.println(arr1 == tmp); System.out.println(arr2 == tmp); } }

在范例5-10中,虽然arr1与arr2中的元素值是相同的,arr1 == arr2并非比较arr1和arr2数组元素值,而是引用的比较,比较arr1和arr2是否指向的是内存中同一个位置。但实际上arr1与arr2是引用自不同的两个数组对象, arr1== arr2布尔表达式的值为false。将arr1指定给tmp来引用,由于tmp与arr1是引用同一数组对象,所以进行==比较时会显示true;而tmp与arr2是引用自不同数组对象,所以进行==比较时会显示false。执行结果如下:

图5.10 TestArrayValue.java执行结果

进行数组复制的另一种方法是使用System类提供的arraycopy()方法。其语法如下: System.arraycopy(来源, 起始索引, 目的, 起始索引, 复制长度); 修改范例5-9,使用

System.arraycopy(array1, 0, array3, 0, array1.length);

19

替换掉原有的相应代码,实现数组的复制。测试程序,保证程序的运行结果与原来一致。

实验5.4.16: (D)for-each循环与数组

Java SE 5.0新增了for-each的语法,又称强化的for循环(Enhanced for Loop),应用于数组的依次存取。for-each循环的语法如下:

for (ElementType element : arrayName) {}

解释一下,冒号前面是声明一个临时变量,将在该foreach的代码段中进行引用;冒号后面是表达式,应该为集合或者数组。注意,临时变量element的类型ElementType必须与数组(或集合)元素的数据类型相同。

运行AccessArrayWithForEach.java(范例5-11),学习for-each循环的用法。

程序清单5-11:AccessArrayWithForEach.java

public class AccessArrayWithForEach {

public static void main(String[] args) { String months[] = {\ \ // Shortcut syntax loops through array months and assigns the next

// element to variable month for each pass through the loop for(String month: months) {

System.out.println(\}

} }

AccessArrayWithForEach.java中,每一次从数组months中取出的元素,会自动设定给month,不再需要判断是否超出了数组的长度。与AccessArrayWithForLoop.java(范例5-2)相比较,For-each的形式实现数组中的元素的依次存取,比for循环的代码简洁不少。但是这种形式的一个最大的缺点就是for-each没法定位访问单个元素,也就没办法修改,删除集合中的内容; 同时,for-each也不能并行操作多个集合。所以,在编写代码时,还得看情况使用它。

二维数组如何使用for-each的方式来存取呢?要是了解数组本身就是一个对象,自然就会知道如何存取。举个例子:

int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

For-each形式的数组存取代码如下:

for ( int[] row : arr ) {

for ( int element : row ) {

System.out.println(element); }

20


Java 快速入门练习(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:放下比拿起难VS拿起比放下难【黄执中、熊浩】拙笔复盘

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: