兩個乒乓球隊進行比賽名單編程題.
/**
* 兩個乒乓球隊進行比賽,各出三人。
* 甲隊為a,b,c三人,乙隊為x,y,z三人。
* 已抽簽決定比賽名單。有人向隊員打聽比賽的名單。
* a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
/**
* The Class Race.
* @author 灬猜想灬
* @since 2012-10-13
*/
public class Race
{
/** The team A. A隊成員列表. */
private final List<String> teamA = new ArrayList<String>();
/** The team B. B隊成員列表. */
private final List<String> teamB = new ArrayList<String>();
/** The race map. 初始比賽選手對照表. */
private final Map<String, List<String>> raceMap = new TreeMap<String, List<String>>();
/** The result map. 最終比賽選手對照表. */
private final Map<String, String> resultMap = new TreeMap<String, String>();
/** The prefered rule. 預定的比賽規則. */
private final List<String> preRule = new ArrayList<String>();
/**
* The main method.
*
* @param args the arguments
*/
public static void main(final String[] args)
{
final Race t = new Race();
t.calcRaceRule();
t.adjustRaceMap();
System.out.println(t.resultMap);
}
/**
* Instantiates a new Race.
*
* @since 2012-10-13
* @author 灬猜想灬 */
public Race()
{
initTeam(teamA, "a", "b", "c");
initTeam(teamB, "x", "y", "z");
initRaceMap();
preRule.add("a!=x");
preRule.add("c!=x");
preRule.add("c!=z");
}
/**
* Initial the team.<br>
* 初始化隊成員列表.
*
* @param racers the teamers
*/
public void initTeam(final List<String> team, final String... racers)
{
for (final String racer : racers)
{
team.add(racer);
}
}
/**
* Initial the race map.<br>
* 初始化初始比賽選手對照表.<br>
* 默認A隊的選手可能會對上B隊的每一個人.
*/
public void initRaceMap()
{
for (final String racer : teamA)
{
raceMap.put(racer, new ArrayList<String>(teamB));
}
}
/**
* Calc race rule.<br>
* 根據預定規則計算選手對照表.
*/
private void calcRaceRule()
{
for (final String rule : preRule)
{
final String a = String.valueOf(rule.charAt(0));
final String b = String.valueOf(rule.charAt(rule.length() - 1));
final List<String> rivals = raceMap.get(a);
if (null != rivals && rivals.contains(b))
{
rivals.remove(b);
}
}
}
/**
* Adjust race map.<br>
* 調整最終的比賽對照表.
*/
public void adjustRaceMap()
{
// 當結果選手對照表的人數和參賽隊伍中的人數相等時才結束調整.
while (resultMap.size() != teamA.size())
{
for (final Entry<String, List<String>> entry : raceMap.entrySet())
{
final String racerA = entry.getKey();
final List<String> racerBs = entry.getValue();
// 結果對照表中已包含選手A時跳過.
if (resultMap.containsKey(racerA))
{
continue;
}
// 從選手A的所有對手中移除所有已經在結果對照表中的選手.
racerBs.removeAll(resultMap.values());
// 如果選手A的對手列表中只剩下一個選手B,則將這個組合加入結果對照表中.
if (1 == racerBs.size())
{
resultMap.put(racerA, racerBs.get(0));
}
}
}
}
} 本文由用戶 灬猜想灬 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!