java awt实现随机选课

朋友选课犯了难,我说不如给你写个抓阄程序吧,看天意,可以啊,于是说干就干。以下是源码,供参考:

public class SelectClass extends JFrame {
	private static final long serialVersionUID = 1L;
	JPanel pn1 = null;
	JPanel pn2;
	JPanel pn3;
	JTextArea tf = null;
	JLabel msg = null;
	JButton btn1;
	JButton btn2;
	JButton btn3;
	boolean flag = true;

	// 在构造器中,初始化界面
	public SelectClass() {
		tf = new JTextArea(2, 40);
		pn1 = new JPanel();
		// 组件放在面板上
		pn1.add(tf);
		this.add(pn1, BorderLayout.NORTH);
		msg = new JLabel(" 心诚则灵!");
		msg.setForeground(Color.red);
		msg.setFont(new Font("楷体", Font.PLAIN, 80));
		pn2 = new JPanel();
		pn2.add(msg);
		// 面板放在窗体上
		this.add(pn2, BorderLayout.CENTER);
		// 底部的按钮部分
		btn1 = new JButton("开始");
		btn3 = new JButton("自动");
		// 给开始按钮加入事件
		btn1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				/*
				 * 必须使用多线程技术,重新启动一个新的线程,去赋值flag 接着调用chouJiang(), 才可以是程序恢复响应。
				 */
				class ThreadStart extends Thread {
					@Override
					public void run() {
						// 在这里去调用抽奖方法
						flag = true;
						chouJiang();
					}
				}

				// 必须将上面的线程内部类,实例化,之后启动
				new ThreadStart().start();
			}

		});

		btn2 = new JButton("停止");

		// 给停止按钮添加事件监听
		btn2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// 必须启动一个新的停止线程,才能终止无限循环
				class ThreadStop extends Thread {
					@Override
					public void run() {
						flag = false;
					}
				}
				// 启动上面的内部类线程
				new ThreadStop().start();
			}

		});
		btn3.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				chouJiang2();
			}
		});

		pn3 = new JPanel();
		pn3.add(btn1);
		pn3.add(btn2);
		pn3.add(btn3);
		this.add(pn3, BorderLayout.SOUTH);

		// 设置窗口的属性
		this.setTitle("听天由命===>");
		this.setIconImage(getIconImage());
		this.setSize(500, 300);
		this.setLocation(500, 280);
		// JFrame默认的关闭按钮,只是隐藏窗口,需要重写设计关闭功能
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	// 对于一个复杂的任务,首先想到的是封装方法
	public void chouJiang() {
		String text = ""; // 显示在文本框中
		int i = 0;
		String[] arr = { "广告学(会展管理方向)", "法学", "社会学", "对外汉语(公关礼仪)", "广告作品分析", "艺术设计", "艺术设计(多媒体设计与制作)", "广播电视编导",
				"影视作品分析", "影视动画作品分析", "工商管理", "会计学", "国际经济与贸易", "行政管理" };
		while (flag) {
			text = "";
			i = (int) Math.floor(Math.random() * arr.length + 1) - 1;
			System.out.println(i);
			text = arr[i];
			try {
				Thread.sleep(35);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			// 显示在文本框中
			tf.setText(text);
			tf.setFont(new Font("楷体", Font.PLAIN, 20));
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public <T> void chouJiang2() {
		String[] arr = { "广告学(会展管理方向)", "法学", "社会学", "对外汉语(公关礼仪)", "广告作品分析", "艺术设计", "艺术设计(多媒体设计与制作)", "广播电视编导",
				"影视作品分析", "影视动画作品分析", "工商管理", "会计学", "国际经济与贸易", "行政管理" };
		TreeMap map = new TreeMap();// key存放的是数字,value存放的是数字出现的次数
		String text = "";
		for (int i = 0; i < 100000; i++) {
			System.out.println("---" + i);
			text = "";
			int j = (int) Math.floor(Math.random() * arr.length + 1) - 1;
			text = arr[j];
			// 如果数字第一次生成,key就赋值为该数字,value赋值为1
			if (map.get(text) == null) {
				map.put(text, new Integer(1));
				// 否则,数字多次出现,key仍赋值为该数字,但是value应在原有的次数上增加一次。
			} else {
				int value = ((Integer) (map.get(text))).intValue();
				map.put(text, new Integer(value + 1));
			}
		}
		Collection<Integer> c = map.values();
		Iterator<? extends Integer> i = (Iterator<? extends Integer>) c.iterator();
		Integer candidate = i.next();
		while (i.hasNext()) {
			Integer next = i.next();
			if (next.compareTo(candidate) > 0)
				candidate = next;
		}
		int max = candidate;// 统计出现次数最多的数字次数
		System.out.println("--------" + max);
		ArrayList list = new ArrayList();// 存放出现次数最多的数字
		Set set = map.entrySet();
		// 统计每个数字出现的次数
		for (Iterator it = set.iterator(); it.hasNext();) {
			Map.Entry entry = (Map.Entry) it.next();
			String key = entry.getKey().toString();
			int value = ((Integer) entry.getValue()).intValue();
			if (value == max) {
				list.add(key);
			}
			System.out.println(key + " appeared " + value + " times");
		}
		System.out.println(list);
		// 显示在文本框中
		tf.setText("        随机抽取100000次" + "\n" + "  出现最多的是" + list.get(0) + ",共" + max + "次");
		tf.setFont(new Font("楷体", Font.PLAIN, 16));
	}

	public static void main(String[] args) {
		new SelectClass();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值