Java编程练习Day06
01 数组演练
获取一维数组最小值
本实例接受用户在文本框中输入的单行数据,其中数据都是整数数字,以不同数量的空格分割数字。
设计过程:
1.在在项目中新建窗体类ArrayMinValue。在窗体中添加一个文本框和计算按钮以及标签控件。
2.编写计算按钮的事件处理方法,在该方法中获取用户的输入,并通过trim()方法取出左右空格。对字符串内容进行检测,排除非法输入,并把字符串转换为整型数组,然后在遍历数组的同时提取最小值,并显示在窗体标签空间中。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ArrayMinValue extends JFrame implements ActionListener {
//创建标签,文本框,“计算”按钮
JLabel tip1;
JLabel tip2;
JButton run;
JTextField textField;
//创建构造器
public ArrayMinValue(){
//对象实例化
tip1= new JLabel("请在文本框中输入多个整数,以空格为分隔符。例如:3 5 2 3 33 ");
tip2 = new JLabel("数组中最小的数是:");
run = new JButton("计算");
textField = new JTextField(30);
//设置窗体可见
setVisible(true);
//设置关闭方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置窗体位置和大小
setBounds(300,300,400,150);
//设置窗体布局
setLayout(new FlowLayout());
//添加时间监听器
run.addActionListener(this);
//将组件添加到窗口中去
add(tip1);
add(textField);
add(run);
add(tip2);
}
@Override
public void 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(" ");
int[] numArray;//创建整数数组
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 i = 0; i < numArray.length; i++) {
if(min > numArray[i]){
min = numArray[i];
}
}
tip2.setText("数组中最小的数是:"+min);
}
public static void main(String[] args) {
new ArrayMinValue();
}
}
运行结果如下:
将二维数组行列互换
本实例实现数组模拟表格行列数据交换,这在程序开发中常用于表格的整理。
设计过程:
1.在项目中新建ArrayRowColumnSwap类。在该类的主方法中定义一个二维数组,输出该数组的内容。这次输出是为了与交换数据后的数组进行对比。新创建一个同等大小的二维数组,利用双层for循环遍历数组时,把新数组与原数组的行列索引交换进行运算赋值,然后再输出新数组内容。
2.编写输出数组内容的printArray()方法。
public class ArrayRowColumnSwap {
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]+"\t");
}
System.out.println();
}
}
public static void main(String[] args) {
//创建二维数组
int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
System.out.println("行列互相调换前:");
//输出二维数组
printArray(arr);
int[][] arr2 = new int[arr.length][arr.length];
//调整数组行列数据
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr2[i][j] = arr[j][i];
}
}
System.out.println("行列互相调换后:");
//输出二维数组
printArray(arr2);
}
}
运行结果如下:
利用数组随机抽取幸运观众
在电视节目中经常看到随机抽取幸运观众。如果观众抽取的范围较少,可以通过数组实现,而且效率很高。
下面介绍实现的方法:
首先将所有观众姓名生成数组,然后获得数组元素的总数量,再在数组元素中随机抽取元素的下标,根据抽取的下标获得幸运观众。
关键技术:
字符串分割为数组
String类的split()方法可以根据指定的正则表达式对字符进行分割,并返回分割后的字符串数组。
该方法声明如下:
public String[] split(String regex)
参数说明
regex:分割字符串的定界正则表达式生成随机数
抽奖当然是随机抽取的,这就需要用到随机数。Java在MAth类中提供了静态方法random()可以生成0~1之间的double类型随机数值。
该方法声明如下:
public static double random()
由于该方法生成的是0~1之间的小数,而数组下标是整数而且又要根据数组长度来生成随机数,所以要把生成的随机数与数组长度相乘
int index = (int)(Math.random()*personnelArray.length);//生成随机数组索引
该行代码把随机数与数组长度的乘积转换为整型作为随机数组下标索引
设计过程:
1.在项目中创建窗体类ArrayChooseLuckyPeople。在窗体中添加两个文本域,一个文本框和两个按钮,其中两个按钮分别用于抽取幸运观众和退出程序。
2.为文本框添加按键事件监听器,并编写事件处理方法,当用户在文本框中输入观众姓名并按下Enter键时,事件处理方法将观众姓名添加到文本域中并以回车换行作为分割符,然后选择文本框中的所有文本准备接受用户的下一次输入。
关键代码如下:
public void keyPressed(KeyEvent e) {
//不是回车字符不做处理
if (e.getKeyChar() != ‘\n’)
return;
//获取文本框内容
String name = textField.getText();
//如果文本框中没有字符串不做处理
if(name.isEmpty())
return;
//把输入人名与回车符添加到人员列表
area1.append(name+"\n");
//选择文本框所有内容
textField.selectAll();
}
3.编写“抽取”按钮的事件处理方法,在该方法中把文本域保存的所有观众名称分割成字符串后,通过随机数生成数组下标,当然这个下标是不固定的,再在另一个文件域控件中输出抽取幸运观众的颁奖信息
关键代码如下:
public void actionPerformed(ActionEvent e) {
//获取人员列表文本
String perstring = area1.getText();
String[] personnelArray = perstring.split("\n{1,}");//获取人员数组
int index = (int)(Math.random()*personnelArray.length);//生成随机数组索引
//定义包含格式参数的中奖信息
String formatArg = “本次抽取观众人员:\n\t%1KaTeX parse error: Undefined control sequence: \n at position 2: s\̲n̲恭喜%1s成为本次观众抽奖的大奖得主。”
+"\n\n我们将为%1$s颁发:\n\t过期的酸奶二十箱。";
//为中奖信息添加人员参数
String info = String.format(formatArg,personnelArray[index]);
area2.setText(info);//在文本域中显示中奖信息
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class ArrayChooseLuckyPeople extends JFrame {
//创建组件
JTextArea area1;
JTextArea area2;
JTextField textField;
JButton exit;
JButton choose;
JLabel tip1;
JLabel tip2;
//创建盒子
Box box;
Box box1;
Box box2;
Box box3;
public ArrayChooseLuckyPeople(){
//设置窗口标题
setTitle("抽取幸运观众");
//设置背景
setBackground(Color.blue);
//设置窗口不可缩放
setResizable(false);
//设置窗体大小和位置
setBounds(200,200,500,500);
//实例化对象
area1 = new JTextArea(15,15);
area2 = new JTextArea(20,20);
textField = new JTextField(15);
exit = new JButton("退出");
choose = new JButton("抽取");
tip1 = new JLabel("输入在场观众姓名按回车");
tip2 = new JLabel("选取观众人员");
//创建滚动面板展示观众姓名
JScrollPane jp = new JScrollPane(area1);
//设置窗口可见
setVisible(true);
//设置窗口关闭方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置窗体布局
setLayout(new FlowLayout());
//设置事件监听器
textField.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
//不是回车字符不做处理
if (e.getKeyChar() != '\n')
return;
//获取文本框内容
String name = textField.getText();
//如果文本框中没有字符串不做处理
if(name.isEmpty())
return;
//把输入人名与回车符添加到人员列表
area1.append(name+"\n");
//选择文本框所有内容
textField.selectAll();
}
@Override
public void keyReleased(KeyEvent e) {
}
});
choose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取人员列表文本
String perstring = area1.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]);
area2.setText(info);//在文本域中显示中奖信息
}
});
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
//将组件添加到盒当中
box = Box.createHorizontalBox();
box1 = Box.createVerticalBox();
box2 = Box.createVerticalBox();
box3= Box.createVerticalBox();
box1.add(tip1);
box1.add(textField);
box1.add(jp);
box2.add(tip2);
box2.add(area2);
box3.add(choose);
box3.add(exit);
box.add(box1);
box.add(box2);
box.add(box3);
add(box);
}
public static void main(String[] args) {
new ArrayChooseLuckyPeople();
}
}
运行结果如下: