1

それはすべて機能しますが、ひどいように見えます。データを描画するために与えられているのは、ホッケープレーヤーのデータを含むテキストファイルだけです。次に、このデータを取得して、そこからプレーヤーを作成します。次に、これらのプレーヤーのリストを作成します。各チームの勝利数は決して与えられていないので、これがあなたにできる最善のことであるかどうか、私はほとんど疑問に思っています。

基本的に、達成したいのは、最も多くの勝利を収めたチームを見つけることです。これは、各プレーヤーの勝利の目標が合計され、彼らがどのチームから来たのかを判断し、そのチームのためにそれを数えることによって見つけられます。

これは、すべてのプレーヤーを調べて一意のチーム名を見つけることにより、チームオブジェクトとしてチームのリストを作成することで実現しました。

次に、プレーヤーリストを調べました。プレーヤーのチームが、現在見ているチームと同じである場合、勝利したゴールのポイントが与えられます。

次に、さらに別のforループで、これらの目標の量が最も多いチームを見つけます。

このチームを返します。

これは、1つの小さなタスクの合計4つのforループです。ひどいようです。

    /**
     * Returns the team with the most wins
     */
    public Team getTeamWithMostWins() {
        Team teamWithMostWins = new Team();
        List<Team> teams = new List<Team>();

        if (!players.isEmpty()) {

            // Compile the List of teams
            for (int i = 0; i < players.size(); i++) {
                if (!teams.contains(players.get(i).getTeam())) {
                    teams.add(new Team(players.get(i).getTeam()));
                }
            }

            // Set the wins for the teams
            for (int i = 0; i < players.size(); i++) {
                String team = players.get(i).getTeam();
                int winningGoals = players.get(i).getWinningGoals();

                // Go through the teams List to set the points
                for (int j = 0; j < teams.size(); j++) {
                    // If the current player's team is equal to the current team in the loop
                    if ((teams.get(j).getName()).equals(team)) {
                        teams.get(j).incrementWinsBy(winningGoals);
                    }
                }
            }

            int mostWins = teams.get(0).getWins();

            // Find the team with the most wins
            for (int i = 1; i < teams.size(); i++) {
                if (teams.get(i).getWins() > mostWins) {
                    teamWithMostWins = teams.get(i);
                }
            }

        }
        else {
            teamWithMostWins = null;
        }

        return teamWithMostWins;
    }
4

5 に答える 5

2

ジョーダンデニソンがコメントで指摘したように、for-eachループを使用できます。例については、以下を参照してください。

さらに、現在、最初のチームよりも勝利数が多い最後のチームのみを獲得できます。最も多くの勝利を収めたチームを獲得するには、最も多くの勝利を更新する必要があります。

int mostWins = teams.get(0).getWins();

// Find the team with the most wins
for(Team team : teams) {
    if (team.getWins() > mostWins) {
        teamWithMostWins = team;
        mostWins = team.getWins(); // <--- Update the most wins every time you find a team with more wins
    }
}

アップデート

さらに、他の回答に示されているようにマップを使用することを検討してください。

于 2012-10-08T21:32:05.863 に答える
2

マップを使用して、各チームの勝利数を保存できます。

import java.util.Map;
import java.util.HashMap;

/**
 * Returns the team with the most wins
 */
public Team getTeamWithMostWins() {
    if (players.isEmpty()) {
        return null;
    }

    Map<Team, Integer> teamWins = new HashMap<String, Integer>();

    // Set the wins for the teams
    for (Player player : players) {
        Integer count = teamWins.get(player.getTeam());
        count = (count == null)? 0 : count;
        teamWins.set(player.getTeam(), count + player.getWinningGoals());
    }

    Team teamWithMostWins = null;
    Integer mostWins = 0;

    for (Map.Entry<Team, Integer> teamWins : map.entrySet()) {
        Team team = entry.getKey();
        Integer wins = entry.getValue();
        if (wins > mostWins) {
            mostWins = wins;
            teamWithMostWins = team;
        }
    }

    return teamWithMostWins;
}

これを行うには、hashCode()メソッドとequals()メソッドをTeamクラスに追加する必要があります。

于 2012-10-08T21:38:46.500 に答える
1
int                  max      = 0;
Team                 mostWins = null;
Map< Team, Integer > counters = new HashMap<>();
for( Player player : players )
{
    Integer counter = counters.get( player.getTeam());
    if( counter == null ) counter = player.getWinningGoals();
    else                  counter = player.getWinningGoals() + counter
    counters.put( player.getTeam(), counter );
    if( counter > max )
    { 
        max      = counter;
        mostWins = player.getTeam();
    }
}
return mostWins;
于 2012-10-08T21:37:35.573 に答える
1

このコードを意味のある名前の小さな関数に分割することで、このコードを改善できます。

それとは別に、Javaを使用しているという事実はあなたの手を少し結びつけます。高階関数をより適切にサポートする言語では、この種のコードは非常に簡潔に記述できます。

あなたが例を求めたので...ここにあなたのコードのRubyへの大まかな移植があります:

teams = players.map(&:team).uniq
best_team = teams.max_by { |t| players.select { |p| p.team == t }.map(&:winning_goals).reduce(0,&:+) } 
于 2012-10-08T21:40:33.410 に答える
0

グーグルグアバを使用して:

final Multiset<Team> teamWins = HashMultiset.create();
for (Player player : players) {
  teamWins.add(player.getTeam(), player.getWinningGoals());
}

Team teamWithMostWins =
  Collections.max(teamWins, new Comparator<Team>() {
    public int compareTo(Team team1, Team team2) {
        return teamWins.count(team1) - teamWins.count(team2);
    }
  });

int mostWins = teamWins.count(teamWithMostWins);

基本的に、guavaコレクションを使用すると、カウント部分が簡単になります。これをコンパイルしていませんが、正しいアイデアが得られるはずです。Teamに適切な.hashCodeメソッドと.equalsメソッドがあることを確認してください(または、異なるオブジェクトインスタンスでチームデータを複製しないと想定できます)。

于 2012-10-08T22:52:44.467 に答える