2016-07-10 8 views
1

次のデータを格納するために2つのConcurrentHashMapsを使用しています。2つのハッシュマップを置き換えるためのカスタムデータ構造の実装

:、私は Playerまたは Leagueオブジェクトのいずれかを取得することができ、いくつかの操作を検討する

ケースを実行する必要が私はちょうどFootballTeamオブジェクトを考える

private Map<Player, FootballTeam> playerTeamMapping; 
private Map<FootballTeam, League> teamLeagueMapping; 

例として、以下を使用します

  • FootballTeamに関連付けられPlayer年代はありませんが、 FootballTeamエントリはを削除存在している場合エントリー teamLeagueMapping

  • Player(S)が彼らのFootballTeamは変わりますが、FootballTeam
    エントリは、その後、他のプレイヤーは、私がこれまで FootballTeam

を参照されていない場合にのみ、
teamLeagueMappingからFootballTeamエントリを削除存在している場合上記の両方のマップを使用していますが、学習目的のために、私はこの問題を解決するために私自身のデータ構造を定義する必要があると言われました。

私は、2つのマップ(Left = Player, Middle = FootballTeam, Right = League)に裏付けられた汎用クラスThreeWayHashMap<Left, Middle, Right>の作成を考えています。これは取るべき最善のアプローチですか?基本的に3つのマップを同期させておくと、エントリを削除するときに削除するときに必要になります(両方でこれらの操作を確実に実行する必要があります)。

+0

使用してください。 A.データベース。 –

+0

ジェネリッククラスを作成したいのはなぜですか?これはあなたのユースケースの一般的な問題ですか?それ以外の場合は、これらの概念を自分のクラスの中に入れることもできます。一般的な実装は読めなくなり、将来は簡単に変更できなくなります。 – kamalkishor1991

+0

@BoristheSpiderもし私ができることがあれば、これはデータベースなしで問題を実装する学習練習です。 – unleashed

答えて

1

既存のクラスを使用してマッピングを表すことができます。 LeagueにはSet<FootballTeam>FootballTeamにはSet<Player>が必要です。リーグとFootballTeamには、プレーヤーをチームに追加したり削除したり、リーグにチームを追加したり削除したりするユーティリティメソッドが必要です。

public class League { 
    Set<FootballTeam> teams = new HashSet<FootballTeam>(); 

    public void addPlayer(FootballTeam team, Player player) { 
     team.addPlayer(player); 
     teams.add(team); 
    } 

    public void removePlayer(FootballTeam team, Player player) { 
     team.removePlayer(player); 
     teams.remove(team); 
    } 

    public void movePlayer(FootballTeam from, FootballTeam to, Player player) { 
     from.movePlayerTo(to, player); 
     if (from.getPlayers().size() == 0) { 
      teams.remove(from); 
     } 
     teams.add(to); 
    } 
} 

public class FootballTeam { 
    private Set<Player> players = new HashSet<Player>(); 

    public void addPlayer(Player player) { 
     player.setTeam(this); 
     players.add(player); 
    } 

    public void removePlayer(Player player) { 
     player.setTeam(null); 
     players.remove(player); 
    } 

    public void movePlayerTo(FootballTeam to, Player p) { 
     player.setTeam(to); 
     players.remove(p); 
    } 
} 
関連する問題