要求
使用Math和ArrayList完成一个摇奖机的功能
- 将一些学生对象加入到ArrayList中(从控制台输入学生信息)
- 输入2抽象
=双11大抽奖
1.添加抽奖学生==
=2.开始抽奖========
输入1:
输入学生信息,添加学生
输入" end" 完成添加
输入2:
开始抽奖,对于被抽取到的学生提示:恭喜中奖,作业题10道!
已经中过奖的学生从集合中移除 remove
输入“back”可以返回上一级菜单
学生信息:学号,姓名,性别
思路
编写多个方法,然后调用这些方法完成功能。返回上一级需要用到递归的方法。
代码(1)
创建学生(student)类,定义属性、方法,和一个带参数的构造器、一个不带参数的构造器。
package com.softeem.lesson13.dafuweng;
public class Student {
private int sno;
private String sname;
private String sex;
public Student() {
// TODO Auto-generated constructor stub
}
public Student(int sno, String sname, String sex) {
super();
this.sno = sno;
this.sname = sname;
this.sex = sex;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
代码(2)
package com.softeem.lesson13.dafuweng;
//导包
import java.awt.Color;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Extruct {
//用ArrayList创建一个包含学生类的数组
static ArrayList<Student>list = new ArrayList<>();
//定义窗体,好处是只创建一个窗体,后面可以都使用这个窗体
private JFrame j;
//添加学生
public void addStu() {
System.out.println("请输入学生信息,例如(1001/softeem/男):");
///输入String
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
//提取用"/"分割符分离的字符串到一个数组
String[] info = str.split("/");
//判断输入的内容是否包含三项信息
if(info.length != 3) {
System.out.println("信息输入有误!");
//递归
addStu();
return;
}
//将输入的信息截取以及转换之后存储到对象中
Student s = new Student(Integer.parseInt(info[0]),info[1],info[2]);
//将对象加入集合
list.add(s);
System.out.println("输入end返回上一级菜单!输入其他继续添加");
if("end".equals(sc.nextLine())) {
//todo 上一级菜单
menu();
}else {
addStu();
}
}
//抽奖
public void ext() {
//每次抽取之前,先隐藏上一个窗口
if(j != null) {
j.setVisible(false);
}
if(list.size() > 0) {
//从学生集合中随机一个索引
int index =(int) (list.size() * Math.random());
//获取中奖学生
Student stu = list.get(index);
//显示图形界面
showDialog(stu.getSname());
// System.out.println("中奖学生:"+stu.getSname());
//将此学生从集合中移除
list.remove(index);
//返回上一级
menu();
}else {
System.out.println("请继续添加抽奖人!");
addStu();
}
}
public void menu() {
System.out.println("==========SOFTEEM 双十一大抽奖===========");
System.out.println("【1】.添加抽奖学生");
System.out.println("【2】.抽奖");
System.out.println("【0】.退出抽奖");
System.out.println("=========================================");
Scanner sc = new Scanner(System.in);
String i = sc.next();
switch(i) {
case "1":
addStu();
break;
case "2":
ext();
break;
case "0":
System.out.println("谢谢使用,再见!");
System.exit(0);
break;
default:
System.out.println("请重新输入");
//递归
menu();
}
}
//显示窗口
public void showDialog(String name) {
//创建窗体
j = new JFrame("中奖人");
//设置窗口大小
j.setSize(300,200);
//设置居中显示
j.setLocationRelativeTo(null);
//禁止改变窗口大小
j.setResizable(false);
//创建JLabel
JLabel txt = new JLabel(name);
txt.setFont(new Font("楷体",Font.BOLD,50));
txt.setForeground(Color.RED);
//将JLabel加入到窗体中显示
j.add(txt);
// j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示窗体
j.setVisible(true);
}
//测试
public static void main(String[] args) {
new Extruct().menu();
}
}
运行结果
添加完成后输入end结束添加,否则继续添加学生。
总结
很典型的例题,先创建一个存入数组的学生类型,然后要用到接触不久的str.split("/") ;Integer.parseInt(info[0])。返回上一级和重新添加都需要用到递归的方法。最后一个难点就是关于窗口的一些方法的运用,因为比较陌生,所以难以运用,需要多接触,多理解。