随机分组java

说明:对要进行分组的类容以记事本的形式保存,分组的哥哥元素之间以空格格开(最好是两个空格)

 

共有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++;

}

}

}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值