簡體   English   中英

如何遞歸使用比較器?

[英]How to use a Comparator recursively?

我必須按照誰贏得最多游戲的順序對陣列​​“名稱”(下圖)中的隊伍進行排名。 如果兩支球隊贏得相同數量的比賽,那么我必須比較擊敗他們的球隊的勝利。 我到目前為止的代碼如下。

完整的問題陳述在這里給出: http//www.cs.duke.edu/csed/newapt/tournamentrank.html

所以我想遞歸地使用比較器。 比較器如何才能訪問原始數據? 我嘗試創建一個Team類,該類可以為擊敗它的團隊獲取同一個類的變量,但這顯然不起作用。 困在這里,請幫忙!

public class TournamentRanker implements Comparator<String>{

public class Team {
    String name;
    Integer wins;
    Team beatEm;
}

        //HOW TO make maps visible to comparator?
         public String[] rankTeams(String[] names, String[] lostTo) { 

             //map all teams to number of wins & to team that beat them
             ArrayList<String> teams = new ArrayList<String>();
             HashMap<String, Integer> Teamwins = new HashMap<String, Integer>();
                HashMap<String, String> Whobeat = new HashMap<String, String>();

             for(int x=0; x<names.length; x++)
             {
                 if(!teams.contains(names[x]))
                     teams.add(names[x]);

                 if(!Teamwins.containsKey(names[x]))
                     Teamwins.put(names[x], 0);
                 Whobeat.put(names[x],  lostTo[x]);
                 if(!Teamwins.containsKey(lostTo[x]) && !lostTo[x].equals(""))
                     Teamwins.put(lostTo[x], 0);
                 if(!lostTo[x].equals(""))
                     Teamwins.put(lostTo[x], (Teamwins.get(lostTo[x])+1));
             }
             for(String s: names)
             {
                 Integer wins = Teamwins.get(s);
                 Team beatEm = new Team(Whobeat.get(s), Teamwins.get(Whobeat.get(s)), ????)
             }
             //SORT list & turn into ARRAY
             Comparator<String> comp = new TournamentRanker();
             Collections.sort(teams, comp);
             String [] sortedTeams = new String[teams.size()];
             return teams.toArray(sortedTeams);



         }
        //NEED to use compareTo***?? OTHER strategy????

        //USE COMPARTOR - how to access all the data?

        public int compare(String team1, String team2){


        }       

 }

為了使地圖可見,我建議將Comparator作為TournamentRanker的內部類,並使地圖實例成為TournamentRanker類的成員,如下所示:

public class TournamentRanker {

    public class Team {
        String name;
        Integer wins;
        Team beatEm;
    }

    // Map all teams to number of wins & to team that beat them
    ArrayList<String> teams = new ArrayList<String>();
    HashMap<String, Integer> Teamwins = new HashMap<String, Integer>();
    HashMap<String, String> Whobeat = new HashMap<String, String>();

    public String[] rankTeams(String[] names, String[] lostTo) { 
        TeamComparator teamComparator = new TeamComparator();

        // Use teamComparator to sort teams.
        ...
    }

    private TeamComparator implements Comparator<String> {
        public int compare(String team1, String team2){
            // This function can now access the maps.

            // Perform the comparison here.
            ...
        }
    }
}

如果你的目標是編寫一個面向對象的程序,我會按如下方式構造它:

  1. 一個Game類,包含對參與Game的兩個團隊的引用,以及每個團隊的分數。
  2. 一個Team類,其中包含由對方團隊ID索引的游戲MapGame對象)。 如果兩個團隊不止一次見面,那么你需要一個“多圖”,每個鍵允許多個值對象。
  3. 一個Tournament對象,包含Team實例(可能是由團隊名稱索引的Map )和Game對象(另一個Map由您選擇的某個唯一鍵索引)。

在你的比較器中,你可以比較兩支球隊的輸贏記錄,如果有關系,請查看每支球隊的個人比賽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM