2017-01-31 12 views
1

私はHashMapを使用して複数のプレーヤーオブジェクトを1つのゲームオブジェクトに関連付けています。複数のキーが1つの値を指しているGuava HashBiMapの逆数

特定のゲームに関連するプレイヤーを取得したいと考えています。 したがって、GuavaのHashBiMapをキーとして使用し、ゲームを値として使用し、その逆を取ってゲームに関連付けられたプレイヤーを見つけることを考えました。

これが可能なら誰でも知っていますか?逆は、別のHashBiMapを返します。重複したキーのために、私は本当にマルチマップが必要です。

どのような考えですか?

答えて

0

おそらく複数のデータ構造を使用します。

Map<Game, Set<Player>> gamePlayers = new HashMap<>(); 

あなたは、特定のプレイヤーが中にあるゲームを見つける必要がある場合は、あなたも持つことができます:

Map<Player, Game> playersGames = new HashMap<>(); 

だからあなたが持っているだろうゲーム内のすべてのプレーヤーを検索するための

public void addPlayerToGame(Player player, Game game) { 
    gamePlayers.computeIfAbsent(game,() -> new TreeSet<>()).add(player); 
    playersGames.put(player, game); 
} 
0

あなたはCQEngine使用することができます。

IndexedCollection<GamePlayer> gamePlayers = new ConcurrentIndexedCollection<>(); 
SimpleAttribute<GamePlayer, Game> gameAttribute = attribute(GamePlayer::getGame); 
SimpleAttribute<GamePlayer, Player> playerAttribute = attribute(GamePlayer::getPlayer); 
gamePlayers.addIndex(HashIndex.onAttribute(gameAttribute)); 
gamePlayers.addIndex(HashIndex.onAttribute(playerAttribute)); 

Game spades = new Game("Spades"); 
Game hearts = new Game("Hearts"); 
Game rummy = new Game("Rummy"); 
Player joe = new Player("Joe", 23); 
Player mary = new Player("Mary", 24); 
Player jane = new Player("Jane", 19); 
Player charles = new Player("Charles", 56); 
Player daniel = new Player("Daniel", 29); 

gamePlayers.add(new GamePlayer(hearts, joe)); 
gamePlayers.add(new GamePlayer(hearts, mary)); 
gamePlayers.add(new GamePlayer(hearts, jane)); 
gamePlayers.add(new GamePlayer(hearts, charles)); 
gamePlayers.add(new GamePlayer(spades, charles)); 
gamePlayers.add(new GamePlayer(spades, jane)); 
gamePlayers.add(new GamePlayer(spades, daniel)); 
gamePlayers.add(new GamePlayer(spades, mary)); 
gamePlayers.add(new GamePlayer(rummy, charles)); 
gamePlayers.add(new GamePlayer(rummy, jane)); 

System.out.println("Spades' players:"); 
for (GamePlayer spadesGamePlayer : gamePlayers.retrieve(equal(gameAttribute, spades))) { 
    Player player = spadesGamePlayer.getPlayer(); 
    System.out.println(" - " + player.getName() + " (age " + player.getAge() + ")"); 
} 
System.out.println(); 
System.out.println("Mary's games:"); 
for (GamePlayer maryGamePlayer : gamePlayers.retrieve(equal(playerAttribute, mary))) { 
    Game game = maryGamePlayer.getGame(); 
    System.out.println(" - " + game.getName()); 
} 

出力:

Spades' players: 
    - Daniel (age 29) 
    - Jane (age 19) 
    - Mary (age 24) 
    - Charles (age 56) 

Mary's games: 
    - Hearts 
    - Spades 
+0

私の答えに印をつけた人が役に立たないと答えた人がいたら、それはいいだろう。 – mfulton26

0

(カップルのプレイヤーが同じゲームにすることができるためではないBiMap、)あなたはMapでゲームにマッピングされたプレーヤーを持っている場合、あなたは何を達成するためにグアバのMultimaps#forMapビューとMultimaps#invertFromを使用することができます欲しいとゲームごとのプレイヤーの集まりでゲームを持っている(あなたが更新ので、もしinvertFromコピー値は、playersGamesは、gamesPlayersが変更されないことに注意してください):

static Map<Player, Game> playersGames; 

static { 
    final Game game1 = new Game(); 
    final Game game2 = new Game(); 
    final Game game3 = new Game(); 
    playersGames = ImmutableMap.of(
      new Player(), game1, 
      new Player(), game1, 
      new Player(), game2, 
      new Player(), game2, 
      new Player(), game3 
    ); 
    // {Player1=game1, Player2=game1, Player3=game2, Player4=game2, Player5=game3} 
} 

static Multimap<Game, Player> gamePlayers = Multimaps.invertFrom(
     Multimaps.forMap(playersGames), 
     ArrayListMultimap.create()); // or any other Multimap implementation 
// {game2=[Player3, Player4], game3=[Player5], game1=[Player1, Player2]} 
関連する問題