2016-07-10 6 views
1

Ich verwende zwei ConcurrentHashMaps, um die folgenden Daten zu speichern. Ich werde im folgenden als BeispielImplementieren einer benutzerdefinierten Datenstruktur zum Ersetzen von 2 hashmaps

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

Gegeben verwenden nur die FootballTeam Objekt, ich brauche abrufen zu können, entweder die Player oder League Objekte und einige Operationen

Fälle führen zu berücksichtigen:

  • Wenn es keine Player ‚s zu einem FootballTeam verbunden sind, aber ein FootballTeam Eintrag entfernen existiert dann die FootballTeam Eintrag von teamLeagueMapping.

  • Wenn ein Player (n) ändert ihre FootballTeam aber ein FootballTeam
    Eintrag vorhanden ist, dann entfernen Sie den FootballTeam Eintrag von
    teamLeagueMapping nur, wenn kein anderer Spieler den FootballTeam

  • Referenzierung wird

i Bisher Wenn ich die beiden oben definierten Karten verwende, aber zu Lernzwecken, wurde mir gesagt, dass ich meine eigene Datenstruktur definieren muss, um dieses Problem zu lösen.

Ich denke an das Erstellen einer generischen Klasse ThreeWayHashMap<Left, Middle, Right>, die von den 2 Karten (Left = Player, Middle = FootballTeam, Right = League) unterstützt wird. Ist das der beste Ansatz? Ich muss grundsätzlich drei Karten beim Löschen synchron halten, also beim Entfernen von Einträgen (ich muss sicherstellen, dass ich diese Operationen an beiden ausführe).

+0

Verwenden. Eine Datenbank. –

+0

Warum möchten Sie eine generische Klasse erstellen? Ist das ein generelles Problem für Ihren Anwendungsfall? Ansonsten können Sie dieses Konzept auch in Ihre eigene Klasse einbinden. Die generische Implementierung wird unlesbar sein und Sie können sie nicht einfach in Zukunft ändern. – kamalkishor1991

+0

@BoristheSpider Ich würde, wenn ich könnte, aber dies ist eine Lernübung zur Umsetzung des Problems ohne eine Datenbank. – unleashed

Antwort

1

Sie können Ihre vorhandenen Klassen verwenden, um das Mapping darzustellen. League sollte haben und FootballTeam sollten Set<Player> haben und beide Liga und FootballTeam sollten Dienstprogramm Methoden haben, um einen Spieler aus dem Team hinzufügen oder entfernen und hinzufügen oder entfernen ein Team aus der Liga.

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); 
    } 
}