【问题标题】:How to use a Comparator recursively?如何递归使用比较器?
【发布时间】:2012-08-03 20:55:08
【问题描述】:

我必须按照赢得最多比赛的顺序对数组“名称”(如下)中的球队进行排名。如果两支球队赢得了相同数量的比赛,那么我必须比较击败他们的球队的胜利。我到目前为止的代码如下。

这里给出了完整的问题陈述: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){


        }       

 }

【问题讨论】:

    标签: java sorting comparator


    【解决方案1】:

    为了使地图可见,我建议将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.
                ...
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您的目标是编写一个面向对象的程序,我将其结构如下:

      1. Game 类,包含对参加比赛的两支球队的引用以及每支球队的得分。
      2. 一个Team 类,包含一个由对方球队ID 索引的Map 游戏(Game 对象)。如果两个团队可以多次见面,您将需要一个“多映射”,允许每个键有多个值对象。
      3. 一个Tournament 对象,包含Team 实例(可能是一个由团队名称索引的Map)和Game 对象(另一个Map 由您选择的某个唯一键索引)。

      在您的比较器中,您可以比较两支球队的输赢记录,如果出现平局,请查看每支球队的个人比赛。

      【讨论】:

        猜你喜欢
        • 2014-12-08
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        相关资源
        最近更新 更多