实例032 将二维数组中的行列互换

实例032 将二维数组中的行列互换

实例说明

数组是程序开发中最常用的,其中二维数组使用最频繁,它可以存储表格数据,还可以根据数组下标索引加入各种运算。另外,图片的关键运算方法也是以二维数组为基础进行矩阵运算的。作为数组知识的巩固,本实例实现数组模拟表格行与列数据交换,这在程序开发中常用于表格数据的整理。实例的运行输出效果,如下所示。

1
2
3
4
5
6
7
8
行列互调前:
1 2 3
4 5 6
7 8 9
行列互调后:
1 4 7
2 5 8
3 6 9
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
38
39
40
41
42
43
44
45
46
package com.mingrisoft;

public class ArrayRowColumnSwap {
public static void main(String[] args) {
// 创建二维数组
int before[][] = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
System.out.println("行列互调前:");
// 输出二维数组
printArray(before);
int after[][] = new int[before.length][before[0].length];
// 调整数组行列数据
transposeMatrix(before, after);
System.out.println("行列互调后:");
// 输出行列互调后的二维数组
printArray(after);
}

/**
* 转置矩阵
*
* @param before 要转置的矩阵
* @param after 转制后的矩阵
*/
private static void transposeMatrix(int[][] before, int[][] after) {
for (int i = 0; i < before.length; i++) {
for (int j = 0; j < before[i].length; j++) {
after[i][j] = before[j][i];
}
}
}

/**
* 遍历数组并输出数组的全部元素
*/
private static void printArray(int[][] arr) {
// 遍历数组
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
// 不换行输出数组元素
System.out.print(arr[i][j] + " ");
}
// 换行
System.out.println();
}
}
}

实例033 利用数组随机抽取幸运观众

实例说明

在电视节目中,经常看到随机抽取幸运观众。如果观众抽取的范围较少,可以让程序使用数组实现,而且效率很高。具体的实现方法是:

  • 首先将所有观众姓名生成数组,
  • 然后获得数组元素的总数量,
  • 最后再随机抽取元素的下标,
  • 根据抽取的下标获得幸运观众。

本实例将利用数组实现随机抽取幸运观众的程序。实例的运行效果如图53所示。
实现过程
(1)在Eclipse中创建项目033,并在该项目中创建com.Mingrisoft包。
(2)在com.Mingrisoft包中新建JFrame窗体类,名称为ArrayExample。在窗体中添加两个文本域、一个文本框和两个按钮,其中两个按钮分别用于抽取幸运观众和退出程序
(3)为文本框添加按键事件监听器,并编写事件处理方法,当用户在文本框中输入观众姓名并按下回车键时,事件处理方法将观众姓名添加到文本域中并以回车换行作为分割符,然后选择文本框中所有文本准备接收用户的下一次输入。关键代码如下:

(4)编写“抽取”按钮的事件处理方法,在该方法中把文本域保存的所有观众名称分割成字符串数组,然后通过随机数生成数组下标,当然这个下标是不固定的,然后在另一个文本域控件中输出抽取幸运观众的颁奖信息。关键代码如下:

指点迷津
在上面的代码中应用了String类的format()方法按指定的方式格式化字符串。其中该方法的第一个参数用于指定格式字符串,第二个参数用于指定格式字符串中由格式说明符引用的参数。这里为幸运观众的名称

多学两招

动态初始化

在创建与初始化数组时,通常是先定义指定类型的数组变量,然后使用new关键字创建数组,再分别对数组元素进行赋值。例如下面的代码:

1
2
3
4
int[] array = new int[3];
array[0]=1;
array[1]=2;
array[2]=3;

静态初始化

另外,Java还支持静态数组初始化,也就是在定义数组的同时为数组分配空间并赋值。例如下面的代码

1
int[] array={1, 2, 3, 4};

技术要点

本实例的重点是把字符串中的人员名单分割为数组,以及随机生成数组的下标索引,这需要用到String类的split()方法和Math类的random()方法。

1.将字符串分割为数组

String类的split()方法可以根据指定的正则表达式对字符串进行分割,并返回分割后的字符串数组,例如“a,b,c”,如果以“,”作为分隔符,返回值就是包含“a”、“b”和“c”3个字符串的数组。该方法的声明如下:

1
public String[] split(String regex)

参数说明

  • regex:分割字符串的定界符或正则表达式

2.生成随机数

抽奖当然是随机抽取的,这就需要用到随机数,JavaMath类中提供了静态方法random可以生成0~1之间的double类型的随机数值。该方法的声明如下:

1
public static double random()

由于该方法生成的是0~1之间的小数,而数组下标是整数而且又要根据数组长度来生成随机数,所以要把生成的随机数与数组长度相乘,就像本实例中的算法那样。关键代码如下:

1
int index = (int) (Math.random() * personnelArray.length);// 生成随机数组索引

此代码把随机数与数组长度的乘积转换为整型作为随机数组下标索引。