兩個乒乓球隊進行比賽名單編程題.

 /**
 * 兩個乒乓球隊進行比賽,各出三人。
 * 甲隊為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));
                }
            }
        }
    }
}
 本文由用戶 灬猜想灬 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!