1、循环网球赛源码原创需求 : 假设有n=2k 个运动员要进行网球循环赛。设计一个满足一下要求的比赛日程表:(1). 每个选手必须与其他n-1个选手各赛一次(2). 每个选手一天只能赛一次(3). 循环赛一共进行n-1天利用Java语言开发一个界面,输入运动员的个数,输出比赛日程表。对于输入运动员数目不满足n=2k时,弹出信息提示用户。共两个类,需放到com包下。运行 Match类。第一个类:package com;import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.event.ActionEvent;im
2、port java.awt.event.ActionListener;import java.util.List;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JPanel;import javax.swing.JTextField;/* * 网球赛 * author Cris * ClassName: Match * Version * ModifiedBy * Copyright 2010 H
3、&L Technology Inc. * date 2011-5-24 上午11:29:39 * description */public class Match implements ActionListener private JFrame f; private JTextField tf; private JPanel container; private JList myList ; private JLabel message; private JButton b; /* * author Cris * title: main * date 2011-5-23 上午11:07:27
4、* param args void */ public static void main(String args) Match t = new Match(); t.go(); public void go() f = new JFrame(比赛); f.setLocation(100, 200); f.setSize(600,500); container = new JPanel(new BorderLayout(); f.setContentPane(container); JPanel title = new JPanel(new FlowLayout(); tf = new JTex
5、tField(10); title.add(tf); b = new JButton(确定); b.addActionListener(this); title.add(b); message = new JLabel(); title.add(message); container.add(title,BorderLayout.NORTH); myList = new JList(); container.add(myList,BorderLayout.CENTER); f.setVisible(true); /* * 显示比赛结果 * author Cris * title: show *
6、 date 2011-5-24 上午11:31:05 * param n void */ private void show(int n) Cris c = new Cris(n); ListList result = c.getResult(); String str = new Stringresult.size(); for (int i = 0; i result.size(); i+) StringBuilder sb = new StringBuilder(); sb.append(第).append(i+1).append(天: ); List matchList = resul
7、t.get(i); for(String match : matchList) sb.append().append(match0).append(-).append(match1).append( ); stri = sb.toString(); myList.setListData(str); message.setText(); f.setVisible(true); /* * 清空数据 * author Cris * title: clear * date 2011-5-24 上午11:30:36 void */ private void clear() String str = ;
8、myList.setListData(str); message.setText(); public void actionPerformed(ActionEvent e) clear(); String s = tf.getText(); if (s = null | .equals(s = s.trim() ) message.setText(请输入一个偶数); try int n = Integer.parseInt(s); if (n = 0 | n % 2 != 0) message.setText(请输入一个偶数); else show(n); catch (Exception e
9、x) message.setText(请输入一个偶数); f.setVisible(true); 第二个类:package com;import java.util.ArrayList;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Random;public class Cris /*选手数量*/ private int n ; /*各个运动员还没进行的比赛 key:球员名称,value:需进行的比赛集合*/ pri
10、vate MapString, List playerMacth ; /*球员人名*/ private String players ; /*最终每天的比赛分布集合*/ private ListList result; /*所有可选的比赛*/ private ListList allMatchData; /*每天的比赛*/ List dayMatch ; /*一个随机对象*/ private Random r; /*当前运算到的天数*/ private int nowDay; public Cris(int n) this.n = n; playerMacth = new HashMapStr
11、ing, List(); result = new ArrayListList(); allMatchData = new LinkedListn-1; r = new Random(); init(); go(); /* * 初始化球员 * author Cris * title: init * date 2011-5-23 下午04:22:32 void */ private void init() /定义球员人名,以数字代表,从1开始 players = new Stringn; for (int i = 0; i players.length; i+) /定义球员的名字 players
12、i = String.valueOf(i+1); /存放每个球员要进行的比赛的集合 List matchList = new LinkedList(); /球员赛事集合 playerMacth.put(playersi, matchList); /球员集合,不变/ playerListConst.add(playersi); /定义每个人的比赛 for (int i = 0; i players.length -1; i+) for (int j = i+1; j players.length ; j+) String match = playersi,playersj;/定义一个比赛 /把此
13、赛事添加到相应球员需比赛集合中 playerMacth.get(playersi).add(match); playerMacth.get(playersj).add(match); /* * 随机获得一个当前天数可进行的比赛组合,并把此比赛组合从总集合中移除 * 如果当前天数无比赛,则先获得比赛,再随机 * author Cris * title: getNowDayMatch * date 2011-5-24 上午09:48:23 * return List */ private List getNowDayMatch() if (allMatchDatanowDay = null) se
14、tAllMatchNowDay(); if (! allMatchDatanowDay.isEmpty() int index = r.nextInt(allMatchDatanowDay.size(); List list = allMatchDatanowDay.get(index); allMatchDatanowDay.remove(index); return list; else return null; /* * 取消前一天的比赛 * author Cris * title: cancelYesterday * date 2011-5-24 上午09:56:12 void */
15、private void cancelYesterday() /清空当前天数的可选比赛组合 allMatchDatanowDay = null ; /时间恢复到前一天 nowDay-; /获得前一天的比赛 List matchList = result.get(nowDay); /取消前一天的比赛 result.remove(nowDay); /恢复每个运动员未进行的比赛 for(String match : matchList) playerMacth.get(match0).add(match); playerMacth.get(match1).add(match); public voi
16、d go() /循环比赛天数 for ( nowDay = 0; nowDay n -1; ) /1.随机一个比赛 List matchList = getNowDayMatch(); /无比赛组合 ,返回上一天 取消上一天的比赛,时间回退到前一天,跳过此次循环 if (matchList = null) cancelYesterday(); continue; /3遍历比赛 去除运动员 去除运动员的未进行比赛 for(String match : matchList) playerMacth.get(match0).remove(match); playerMacth.get(match1)
17、.remove(match); result.add(matchList); nowDay+; /* * 从1号队员开始,获得当前天数所有可组合的赛事 * author Cris * title: setAllMatchNowDay * date 2011-5-24 上午09:42:51 void */ private void setAllMatchNowDay() allMatchDatanowDay = new LinkedListList(); int n = 1;/1号运动员 /此运动员未进行的比赛 List matchList = playerMacth.get(String.va
18、lueOf(n); for(String match : matchList) List selectedList = new ArrayList(); selectedList.add(match); doDetAllMatchNowDay(n+1, selectedList); /* * 今天比赛的所有组合 * author Cris * title: doDetAllMatchNowDay * date 2011-5-24 上午09:46:05 * param playerNum * param selectedList void */ private void doDetAllMatc
19、hNowDay(int playerNum,List selectedList) /运动员名称 String player = String.valueOf(playerNum); boolean flag = true; /判断此运动员是不是已被选过 for(String match : selectedList) if (match0.equals(player) | match1.equals(player) flag = false; break; /已被选过 if ( flag = false) /最后一个人员 if (playerNum = n) allMatchDatanowDa
20、y.add(selectedList); else doDetAllMatchNowDay(playerNum+1, selectedList); return; /此运动员未进行的比赛 List matchList = playerMacth.get(player); /此运动员可选择的比赛 List canDoList = new ArrayList(); for(String match : matchList) flag = true; for(String selected : selectedList) if(match0.equals(player) if(match1.equa
21、ls(selected0) flag = false; else if(match1.equals(selected1) flag = false; else if(match0.equals(selected0) flag = false; else if(match0.equals(selected1) flag = false; if (flag) canDoList.add(match); /遍历此运动员可选择的比赛 for(String match : canDoList) List newList = copyArrayList(selectedList); /记录当前比赛 new
22、List.add(match); /最后一个人员 if (playerNum = n) allMatchDatanowDay.add(newList); else doDetAllMatchNowDay(playerNum+1, newList); /* * 复制集合 * author Cris * title: copyArrayList * date 2011-5-24 上午09:24:44 * param list * return List */ private List copyArrayList(List list) List newList = new ArrayList(); for(String s : list) newList.add(s); return newList; public ListList getResult() return result;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1