第5章 数组及其常用操作

第5章 数组及其常用操作

本章读者可以学到如下实例:

  • 实例031 获取一维数组的最小值
  • 实例032 将二维数组中的行列互换
  • 实例033 利用数组随机抽取幸运观众
  • 实例034 用数组设置JTable表格的列名与列宽
  • 实例035 使用按钮控件数组实现计算器界面
  • 实例036 通过复选框控件数组实现添加多个复选框控件
  • 实例037 使用选择排序法对数组排序
  • 实例038 使用冒泡排序法对数组排序
  • 实例039 使用快速排序法对数组排序
  • 实例040 使用直接插入法对数组排序
  • 实例041 使用Sort()方法对数组排序
  • 实例042 反转数组中元素的顺序

实例031 获取一维数组的最小值

实例说明

一维数组常用于保存线性数据,如数据库中的单行数据就可以使用一维数组保存。本实例将接收用户在文本框中输入的单行数据(其中数据都是整数数字,以不同数量的空格分割),这个数据将被程序分解成一维数组,并从数组中提取最小值显示在界面中。实例的运行效果如图5.1所示。

指点迷津

程序经过特殊判断,数字之间的空格可以使用多个

实现过程

(1)在Eclipse中创建项目031,并在该项目中创建com.Mingrisoft包.
(2)在com.Mingrisoft包中新建JFrame窗体类,名称为ArrayMinValue。在窗体中添加个文本框和一个“计算”按钮以及多个标签控件
(3)编写“计算”按钮的事件处理方法,在该方法中首先获取用户的输入,并通过trim()方法去除左右空格,然后对字符串内容进行检测,排除非法输入,并把字符串转换为整型数组,最后在遍历数组的同时提取最小值并显示到窗体的标签控件中。关键代码如下:

G:\Desktop\书籍\Java\Java 实战\Java经典编程300例\Java经典编程300例\SL\04\030\src\com\mingrisoft\CycFilter.java
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
protected void do_button_actionPerformed(ActionEvent e) {
String arrayStr = textField.getText().trim(); // 去除左右空格
if (arrayStr.equals("")) {
JOptionPane.showMessageDialog(null, "请输入数字内容");
return;
}
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
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package com;

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ArrayMinValue extends JFrame
{

/**
*
*/
private static final long serialVersionUID = -2066250832480702511L;
private JPanel contentPane;
private JTextField textField;
private JLabel lblNewLabel_1 = new JLabel("");

/**
* Launch the application.
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
public void run()
{
try
{
ArrayMinValue frame = new ArrayMinValue();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public ArrayMinValue() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new GridLayout(4, 1, 0, 0));

JLabel lblNewLabel = new JLabel("请在文本框中输入多个整数,以空格为分隔符。例如:3 5 2 562 125");
lblNewLabel.setVerticalAlignment(SwingConstants.TOP);
contentPane.add(lblNewLabel);

textField = new JTextField();
contentPane.add(textField);
textField.setColumns(10);

JPanel panel = new JPanel();
contentPane.add(panel);
panel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

JButton btnNewButton = new JButton("计算");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
do_button_actionPerformed();
}

private void do_button_actionPerformed()
{
// 获取文本框中的内容
String inputText = textField.getText();
// 检查输入合法性
if (checkInput(inputText))
{
// 解析输入成数组
int[] numbers = parseInputIntoArray(inputText);
// 查找数组中最小值所在的下标
int minIndex = findMinIndex(numbers);
lblNewLabel_1.setText("最小值:" + numbers[minIndex]);
}
}
/**
* 将输入转换成int数组
* @param inputText 文本框中的输入.
* @return int数组
*/
private int[] parseInputIntoArray(String inputText)
{
String[] numberStrs = inputText.trim().split(" ");
int[] numbers = new int[numberStrs.length];
for (int i = 0; i &lt; numbers.length; i++)
{
numbers[i] = Integer.valueOf(numberStrs[i]);
}
return numbers;
}
/**
* 查找数组中最小的元素所在的下标.
* @param numbers 要查找的数组.
* @return 最小值所在的下标.
*/
private int findMinIndex(int[] numbers)
{
int minIndex = 0;
for (int j = 1; j &lt; numbers.length; j++)
{
// 如果后面的比前面的小
if (numbers[j] &lt; numbers[minIndex])
{
// 记录下最小的位置
minIndex = j;
}
}
return minIndex;
}
/**
* 检查输入合法性,不能输入空字符串,也不能输入除了数字和空格之外的其他字符.
* @param inputText 文本框中输入的内容
* @return 如果输入合法,则返回true.
*/
private boolean checkInput(String inputText)
{
if (inputText.equals(""))
{
JOptionPane.showMessageDialog(null, "请输入内容");
return false;
}
for (int i = 0; i &lt; inputText.length(); i++)
{
char ch = inputText.charAt(i);
if (!Character.isDigit(ch) && ch != ' ')
{
JOptionPane.showMessageDialog(null, "请输入数字");
return true;
}
}
return true;
}
});
btnNewButton.setHorizontalAlignment(SwingConstants.LEFT);
panel.add(btnNewButton);
panel.add(lblNewLabel_1);
}
}

多学两招

for语句用于程序的循环流程控制。该语句有3个表达式用于循环变量的控制,其完整语法格式为:

1
2
for(int 1-=0; i<100; i++)(
}

for语句中的3个表达式不是完全必备的,可以根据情况部分省略,甚至完全省略。例如下面代码就以最简单的格式实现了无限循环。

1
2
3
for(;;){

}

技术要点

本实例主要应用String类的split()方法将输入的字符串分割为字符串数组,再将其转换为整型数组,最后通过for循环遍历该数组,并通过if语句提取最小值。其中,split方法可以使字符串按指定的分割字符或字符串进行分割,并将分割后的结果存放在字符串数组中。其语法格式如下

1
String split(String sign);

参数说明:

  • string:为字符串对象
  • sign:为分割字符串的分割符,也可以使用正则表达式。