说明:对要进行分组的类容以记事本的形式保存,分组的哥哥元素之间以空格格开(最好是两个空格)
共有3个类 :
类1:
package com.ata.wx;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
public class FenzuGUI extends JFrame {
private JButton randomSeparate;
private JMenuItem clr;
private JMenuItem save;
private JMenuItem help;
private JButton readin;
private JTextField input;
private JPanel panel1;
private JPanel panel2;
private JPanel panel3;
private JTextArea textArea;
private JScrollPane paneText;
private String array;
private JMenu menu;
private static final long serialVersionUID = 1L;
// //构造函数
public FenzuGUI() {
super("随机分组");
setSize(670, 480);
setUpUICoponent();
setUpUIactionListener();
// 调用重写的System.out方法重定向到textArea
System.setOut(new GUIPrintStream(System.out, textArea));
setVisible(true);
}
// ///GUI设计
private void setUpUICoponent() {
panel1 = new JPanel();
panel2 = new JPanel();
panel3 = new JPanel();
// 设置文本条用于输入要分的组数
input = new JTextField(6);
// 设置按钮
randomSeparate = new JButton("分组");
readin = new JButton("读入");
// 菜单
JMenuBar menuBar = new JMenuBar();
menu = new JMenu("选项");
menuBar.add(menu);
save = new JMenuItem("保存");
clr = new JMenuItem("清除");
help = new JMenuItem("帮助");
menu.add(save);
menu.add(clr);
menu.add(help);
panel2.add(menuBar);
panel1.add(input);
panel1.add(randomSeparate);
panel1.add(readin);
panel3.setLayout(new BorderLayout());
panel3.add(panel2, BorderLayout.WEST);
panel3.add(panel1);
// 设置文本区用于显示分组后的结果
textArea = new JTextArea();
textArea.setFont(new Font("宋体", Font.PLAIN, 16));
textArea.setLineWrap(true);// 设置自动换行
paneText = new JScrollPane(textArea,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
this.add(paneText, BorderLayout.SOUTH);
this.add(panel3, BorderLayout.NORTH);
this.add(paneText);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// ///事件监听
private void setUpUIactionListener() {
// 文本条监听,如果输入不是整数 提示
input.addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent e) {
// 如果输入不是整数
if (!isNumeric(input.getText())) {
// 提示框
JOptionPane.showMessageDialog(null, "请输入整数", "Input error",
JOptionPane.WARNING_MESSAGE);
}
}
});
// 分组按钮监听
randomSeparate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btnOutActionPerformed(evt);
}
});
// 清空菜单监听
clr.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clrActionPerformed(e);
}
});
// 保存菜单监听
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveFileAs();
}
});
// 读入按钮监听
readin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
readinfile();
}
});
// 帮助菜单
help.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane
.showMessageDialog(null, "感谢使用/n" + "说明:将你要分组的成员保存在记/n"
+ "事本里,成员之间以空格为分隔符/n" + "然后点击“读入”,并输入你要分/n"
+ "组 的个数,最后点击分组即可/n" + "选项菜单里的”保存“可保存/n"
+ "分组后的结果/n" + "未经允许不可用于商业用途/n"
+ "copyright by WxJava7/n" + "电话:xxxxxxx/n"
+ "2009-12-18", "help",
JOptionPane.INFORMATION_MESSAGE);
}
});
}
// ///方法
// 按分组钮按后启动分组
private void btnOutActionPerformed(ActionEvent evt) {
// 读取输入文本框的数字
int read = Integer.parseInt(input.getText());
// 启动
startFenzu(read);
}
// 读入文件
private void readinfile() {
JFileChooser fileChooser = new JFileChooser();
// 显示读文件对话框
int option = fileChooser.showDialog(null, null);
if (option == JFileChooser.APPROVE_OPTION) {
try {
// 打开选取的文件
BufferedReader buf = new BufferedReader(new FileReader(
fileChooser.getSelectedFile()));
// 设置文件标题
setTitle(fileChooser.getSelectedFile().toString());
// 删除前一次打开的文件
textArea.setText(null);
// 取得系统相依的换行字符
String lineSeparator = System.getProperty("line.separator");
String text;
// 将读入的文件保存至str中
StringBuffer str = new StringBuffer();
while ((text = buf.readLine()) != null) {
// 读入的字符串显示在文本区
textArea.append(text);
// 追加字符串至str
str.append(text);
textArea.append(lineSeparator);
}
// 将str中字符串给array
array = str.toString();
buf.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e.toString(), "打开文件失败",
JOptionPane.ERROR_MESSAGE);
}
}
}
// // 保存
private void saveFileAs() {
JFileChooser fileChooser = new JFileChooser();
// 显示保存文件对话框
int option = fileChooser.showDialog(null, "保存");
// 如果确认选取文件
if (option == JFileChooser.APPROVE_OPTION) {
// 取得选取文件
File file = fileChooser.getSelectedFile();
try {
// 在标题篮设置文件的名称
setTitle(file.toString());
// 建立文件
file.createNewFile();
// 获取文件标题
try {
// 打开指定的文件
BufferedWriter buf = new BufferedWriter(
new FileWriter(file));
// 将textArea区的文字写入文件
buf.write(textArea.getText());
// 必须关闭
buf.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e.toString(), "写入文件失败",
JOptionPane.ERROR_MESSAGE);
}
} catch (IOException e) {
JOptionPane.showConfirmDialog(null, e.toString(), "无法建立文件",
JOptionPane.ERROR_MESSAGE);
}
}
}
// //返回要分组数组
private String[] reFenzuArray() {
// 正则表达式匹配空格至少出现一次
String tokens[] = array.split("//s{1,}");
return tokens;
}
// 按清空按钮后清空文本域
private void clrActionPerformed(ActionEvent e) {
System.setOut(new GUIPrintStream(System.out, textArea));
textArea.setText(null);
}
// / 判断文本框输入的是不是数字
public boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(str).matches();
}
// /// 启动分组的方法startFenzu()
public void startFenzu(int x) {
System.out.println();
Fenzu1 gf = new Fenzu1();
Fenzu1.gn = x;
gf.showGroup(reFenzuArray(), gf.getGn());
}
// 程序入口
public static void main(String[] args) {
new FenzuGUI();
System.out.println();
System.out.println("*********欢迎使用随机分组程序********/n");
}
}
类2:
package com.ata.wx;
import java.io.OutputStream;
import java.io.PrintStream;
import javax.swing.SwingUtilities;
import javax.swing.text.JTextComponent;
/**
* 输出到文本组件的流。
*
* @author Chen Wei
* @website www.chenwei.mobi
* @email chenweionline@hotmail.com
*/
public class GUIPrintStream extends PrintStream{
private JTextComponent component;
private StringBuffer sb = new StringBuffer();
public GUIPrintStream(OutputStream out, JTextComponent component){
super(out);
this.component = component;
}
/**
* 重写write()方法,将输出信息填充到GUI组件。
* @param buf
* @param off
* @param len
*/
@Override
public void write(byte[] buf, int off, int len) {
final String message = new String(buf, off, len);
SwingUtilities.invokeLater(new Runnable(){
public void run(){
sb.append(message);
component.setText(sb.toString());
}
});
}
}
类3:分组核心代码
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.ata.wx;
/**
*
* copyright by huguangxin 2009-12
**/
import java.util.Random;
public class Fenzu1 {
private int id=1 ;// 显示组号
static int gn; // 分组的个数
private int nextgn; // 下次要分组成员的个数
private String[] stepNextOkArray; // 暂存 ,已分出的成员
private String[] stempFenzuArray; // 暂存 剩余的成员
public Fenzu1(){}
public int getGn(){
return gn;
}
// ///showGroup()方法实现随机分组
public void showGroup(String[] aa, int k){
if (k <= 0) { // 判断组是否分完,分完则退出
return ;
}
int count = 0;
nextgn = aa.length / k;
stepNextOkArray = new String[nextgn];
System.out.print( "第"+id+++"组" + " :"); // 每一组的标号
while (count < nextgn) { // 获不同的取随机数
Random ra = new Random();
int i = ra.nextInt(aa.length);
if (!hasItem(aa[i])) {
stepNextOkArray[count] = aa[i];
System.out.print(stepNextOkArray[count] + " ");
count++;
}
}
System.out.println();
getNextFenzuArray(stepNextOkArray, aa);
showGroup(stempFenzuArray, --Fenzu1.gn); // 递归调用showGroup()方法实现另一组
}
// /hasTtem()方法比较两数组
private boolean hasItem(String name) {
for (int i = 0; i < stepNextOkArray.length; i++) {
if (name.equals(stepNextOkArray[i]))
return true;
}
return false;
}
// /szchazhi()方法求两个数组不一样的部分
private void getNextFenzuArray(String[] xx, String[] yy) {
stempFenzuArray = new String[yy.length - xx.length];
String str = ""; // 构造空的字符串对象str2
for (int j = 0; j < xx.length; j++) {
str += xx[j]; // 将数组zhuanhua一个字符串中
}
int j = 0;
for (int i = 0; i < yy.length; i++) {
if (str.indexOf(yy[i]) == -1) { // 当前字符串不包括字符串常量str1【i】成立
stempFenzuArray[j] = yy[i];
j++;
}
}
}
}