1、获取一维数组最小值
1.1 实例说明
一维数组常用于保存线性数据,例如数据库中的单行数据就可以使用一维数组保存。本实例接收用户在文本框中输入的单行数据,其中数据都是整数数字,以不同数量的空格分割数字,如图1所示。这个先行数据将被程序分解成一维数组,并从数组中提取最小值显示在界面中。
图1 实例运行结果
说明:程序经过特殊判断,数字之间的空格可以使用多个。
1.2 实现过程
(1)在项目中新建窗体类ArrayMinValue。在窗体中添加一个文本框和“计算”按钮以及标签控件。
(2)编写“计算”按钮的事件处理方法,在该方法中获取用户的输入,并通过trim()方法去除左右空格字符。对字符串内容进行检测,排除非法输入,并把字符串转换为整形数组,然后在遍历数组的同时把最小值提取并显示到窗体标签控件中。关键代码如下:
protected void do_button_actionPerformed(ActionEvent e) {
String arrayStr = textField.getText().trim();
for (int i = 0; i < arrayStr.length(); i++) {// 过滤非法输入
char charAt = arrayStr.charAt(i);
if (!Character.isDigit(charAt) && charAt != ' ') {
JOptionPane.showMessageDialog(null, "输入包含非数字内容");
textField.setText("");
return;
}
}
String[] numStrs = arrayStr.split(" {1,}");// 分割字符串
int[] numArray = new int[numStrs.length];// 创建整数数组
// 转换输入为整数数组
for (int i = 0; i < numArray.length; i++) {
numArray[i] = Integer.valueOf(numStrs[i]);
}
int min = numArray[0];// 创建最小数变量
for (int j = 0; j < numArray.length; j++) {
if (min > numArray[j]) {// 提取最小整数
min = numArray[j];
}
}
label.setText("数组中最小的数是:" + min);
}
1.3 秘笈心法
1.3.1 精简的for语句
for语句用于程序的循环流程控制。该语句有3个表达式用于循环变量的控制,其完整语法格式为:
for(int i=0; i<100; i++){
……
}
for语句中的3个表达式不是完全必备的,可以根据情况部分省略,甚至完全省略,例如下面代码就以最简单的格式实现了无限循环。
for (;;) {
……
}
2、将二维数组中的行列互换
2.1 实例说明
数组是程序开发中最常用的,其中二维数组使用最频繁,它可以存储表格数据,根据数组下标索引可以加入各种运算,图片的关键运算方法也是以而为数组为基础进行矩阵运算的。作为数组知识的巩固,本实例实现数组模拟表格行与列数据交换,这在程序开发中常用语表格数据整理。实例运行结果如图1所示。
图1 实例运行结果
2.2 实现过程
(1)在项目中新建ArrayRowColumnSwap类。在该类的主方法中定义一个二维数组,输出该数组的内容,这次输出是为了与交换数据后的数组进行对比。新创建一个同样大小的二维数组,利用双层for循环遍历数组时,把新数组与原数组的行列索引交换进行元素赋值,然后在输出新数组内容。关键代码如下:
public static void main(String[] args) {
// 创建2维数组
int arr[][] = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
System.out.println("行列互调前:");
// 输出2维数组
printArray(arr);
int arr2[][] = new int[arr.length][arr.length];
for (int i = 0; i < arr.length; i++) {// 调整数组行列数据
for (int j = 0; j < arr[i].length; j++) {
arr2[i][j] = arr[j][i];
}
}
System.out.println("行列互调后:");
// 输出2维数组
printArray(arr);
}
说明:本实例为演示数组行列兑换定义了连续数字作为数组元素,这样更方便对比交换后的结果。
(2)编写输出数组内容的pringArray()方法。输出数组内容的业务在程序中出现两次,根据代码重用的原则,如果相同的业务代码在程序中出现两次以上,就应该把它们提取成一个独立的方法。在这个方法中简单的通过双层for循环遍历数组元素,关键代码如下:
private static void printArray(int[][] arr) {
for (int i = 0; i < arr.length; i++) {// 遍历数组
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[i][j] + " ");// 输出数组元素
}
System.out.println();
}
}
2.3 秘笈心法
2.3.1 数组不能声明长度
在Java语言中定义数组变量时,不能声明其长度,只能在new关键字创建数组时指定,例如int[9] array =……是错误的写法。应该是int[] array = new int[9]。
3、利用数组随机抽取幸运观众
3.1 实例说明
在电视节目中,经常看到随机抽取幸运观众。如果观众抽取得范围较少,可以让程序使用数组实现,而且效率很高。下面介绍实现的方法:首先将所有观众姓名生成数组,然后获得数组元素的总数量,然后在数组元素中随机抽取元素的下标,根据抽取的下标获得幸运观众。运行效果如图1所示。
图1 实例运行结果
3.2 关键技术
本实例中的重点是把字符串中的人员名单分割为数组,以及随机生成数组下标索引,这分别需要用到String类的split()方法和Math类的random()方法,下面对这两个方法进行简单介绍。
3.2.1 字符串分割为数组
String类的split()方法可以根据指定的正则表达式对字符串进行分割,并返回分割后的字符串数组,例如“a,b,c”如果以“,”作为分隔符,返回值就是包含“a”,“b”和“c”3个字符串的数组。该方法的声明如下:
public String[] split(String regex)
参数说明:
regex:分割字符串的定界正则表达式。
3.2.2 生成随机数
抽奖当然是随机抽取的,这就需要用到随机数,Java在Math类中提供了静态方法random()可以生成0到1之间的double类型随机数值。该方法的声明如下:
public static double random()
由于该方法生成的是0到1之间的小数,而数组下标是整数而且又要根据数组长度来生成随机数,所以要把生成的随机数与数组长度相乘,就像本实例中的算法那样,关键代码如下:
int index = (int) (Math.random() * personnelArray.length);// 生成随机数组索引
这句代码把随机数与数组长度的乘积转换为整形作为随机数组下标索引。
3.3 实现过程
(1)在项目中创建窗体类,在窗体中添加两个文本域、一个文本框和两个按钮,其中两个按钮分别用于抽取幸运观众和退出程序。
(2)为文本框添加按键事件监听器,并编写事件处理方法,当用户在文本框中输入观众姓名并按下回车键时,事件处理方法将观众姓名添加到文本域中并以回车换行作为分割符,然后选择文本框中所有文本准备接收用户的下一次输入。关键代码如下:
protected void do_textField_keyPressed(KeyEvent e) {
if (e.getKeyChar() != '\n')// 不是回车字符不做处理
return;
String name = nameField.getText();
if (name.isEmpty())// 如果文本框没有字符串不做处理
return;
personnelArea.append(name + "\n");// 把输入人名与回车符添加到人员列表
nameField.selectAll();// 选择文本框所有字符
}
(3)编写“抽取”按钮的事件处理方法,在该方法中把文本域保存的所有观众名称分割成字符串数组,然后通过随机数生成数组下标,当然这个下标是不固定的。然后在另一个文本域控件中输出抽取幸运观众的颁奖信息。关键代码如下:
protected void do_button_actionPerformed(ActionEvent e) {
String perstring = personnelArea.getText();// 获取人员列表文本
String[] personnelArray = perstring.split("\n{1,}");// 获取人员数组
int index = (int) (Math.random() * personnelArray.length);// 生成随机数组索引
// 定义包含格式参数的中奖信息
String formatArg = "本次抽取观众人员:\n\t%1$s\n恭喜%1$s成为本次观众抽奖的大奖得主。"
+ "\n\n我们将为%1$s颁发:\n\t过期的酸奶二十箱。";
// 为中奖信息添加人员参数
String info = String.format(formatArg, personnelArray[index]);
resultArea.setText(info);// 在文本域显示中间信息
}
3.4 秘笈心法
3.4.1 数组的静态初始化
在创建与初始化数组时,通常是先定义指定类型的数组变量,然后new关键字创建数组,在分别对数组元素进行赋值。例如:
int[] array = new int[3];
array[0]=1;
array[1]=2;
array[2]=3;
Java支持静态数组初始化,在定义数组的同时为数组分配空间并赋值。例如:
int[] array = { 1, 2, 3, 4};
4、用数组设置JTable表格的列名与列宽
4.1 实例说明
数组在程序开发中被广泛应用,使用数组可以是程序代码更加规范,更易于维护。例如字符串数组可以定义表格控件的列名称,而整数类型数组可以用来定义列对应的宽度,本实例就通过这两个数组实现了对表格控件中表头列的设置,如图1所示。
图1 实例运行结果
4.2 关键技术
本实例的关键技术在于设置表格的数据模型和访问列模型。其中表格的数据模型可以采用DefaultTableModel类创建数据模型对象,而创建过程中可以把字符串数组作为参数来创建表格列的名称。下面介绍一下这些关键技术的语法。
4.2.1 创建表格数据模型
DefaultTableModel类的构造方法有很多,其中一个可以把字符串数组作为参数来生成列名称,同时接收int类型的参数来设置表格添加多少行空白数据。这个构造方法的声明如下:
public DefaultTableModel(Object[] columnNames, int rowCount)
参数说明:
columnNames:存放列名的数组
rowCount:指定创建多少行空白数据
4.2.2 设置表格数据模型
JTable类是表格控件,它提供了setModel()方法来设置表格的数据模型,设置数据模型以后,表格控件可以从数据模型中提取表头所有列名称和所有行数据,这个数据模型将负责表格所有数据的维护。下面介绍该设置表格模型的方法声明格式:
public void setModel(TableModel dataModel)
参数说明:
dataModel:此表的新数据模型。
4.2.3 获取表格列模型
表格中所有列对象都存放在列模型中,它们用于定义表格的每个列的名称及宽度等信息。表格的列模型可以通过getColumnModel()方法获取。其方法声明如下:
public TableColumnModel getColumnModel()
4.2.4 设置列宽度
列对象存放在列模型中,并且列的宽度需要通过列对象的setPreferredWidth()方法来设置,该方法的语法声明如下:
public void setPreferredWidth(int preferredWidth)
参数说明:
preferredWidth:列对象的首选宽度参数
4.3 实现过程
(1)在项目中创建窗体类ArrayCreateTable。在窗体中添加一个滚动面板。
(2)编写getTable()方法来创建表格,在该方法中声明字符串数组columns作为表格的列名,在声明int类型的数组来定义每个表格列的宽度。然后创建表格的数据模型并遍历所有表格列对象,根据int类型数组的索引来设置表格列的宽度。关键代码如下:
private JTable getTable() {
if (table == null) {
table = new JTable();// 创建表格
// 定义列名数组
String[] columns = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六",
"星期日" };
// 定义列宽数组
int[] columnWidth = { 10, 20, 30, 40, 50, 60, 70 };
// 创建表格数据模型
DefaultTableModel model = new DefaultTableModel(columns, 15);
table.setModel(model);// 设置表格数据模型
TableColumnModel columnModel = table.getColumnModel();// 获取列模型
int count = columnModel.getColumnCount();// 获取列数量
for (int i = 0; i < count; i++) {// 遍历列
TableColumn column = columnModel.getColumn(i);// 获取列对象
column.setPreferredWidth(columnWidth[i]);// 以数组元素设置列的宽度
}
}
return table;
}
4.4 秘笈心法
4.4.1 给表格列名留个位置
如果直接将表格控件添加到滚动面板以外的容器中,首先应该通过JTable类的getTableHeader()方法获取表格的JTableHeader表头类的对象,然后在将该对象添加到容器相应的位置,否则表格将没有表头,无法显示任何列名称。
******************************关于作者******************************
学习过程中有任何问题不懂得都可以进行咨询,欢迎来撩!