0

だから私はハッシュマップを持っています

HashMap<String, ArrayList<String> gMap = new HashMap<String, ArrayList<String>();

そして、誰かがグループを作成すると、グループリーダーがハッシュマップのキーに追加され、グループ内のすべてのユーザーがアレイリストに追加されます

gMap.get(groupLeader).add(user);

グループリーダーのみがプレイヤーを招待できるようにしようとしていますが、プレイヤーがどのグループにも属しておらず、別のユーザーを招待すると、自動的にグループが作成され、プレイヤーがグループリーダーになります。

だから、通常、私はこれを行うだけです

for(ArrayList<String> list : gMap.values()){
    if(list.contains(user)){
        //do something since the player is not part of the list
    }
}

しかし、複数のarrayListが存在する可能性があるため、それを行うことはできません。したがって、ユーザーが1つのarrayListの一部でなくても、別のarrayListに含まれていないという意味ではありません。

したがって、すべてのarrayListをチェックし、ユーザーがそれらのいずれにも含まれていない場合にのみ何かを行う方法に興味があります。

4

4 に答える 4

4

ここでは、実際にマルチマップ (値のコレクションへのキーのマッピング) データ構造を作成しています。これを直接使用すると、現在のように車輪を再発明する必要がないことがわかります。 Guavaは、必要なデータを格納するMultimap interfaceを含む非常に優れた を定義し、必要なことをきれいに実行するメソッドを備えています。他の人が述べたように、リストに対する含むチェックは遅いです。実際に順序を気にしない場合、または本当に気にする場合は、これらの含むチェックをより効率的に行うために使用できます。ArrayListMultimapcontainsValue()HashMultimapLinkedHashMultimap

また、Guava をまだ使用していない場合は、見逃していることになります。Guava は、無数の優れたユーティリティと優れたプラクティスを提供します。

于 2013-08-27T18:52:32.237 に答える
0

まず、リストの代わりにセットを使用します (Java 7 構文)。

Map<String, Set<String> gMap = new HashMap<>();

あなたの目標を正しく理解したら、これが解決策になるかもしれません:

if (isLeader(groupLeader, gMap)) {
  gMap.get(groupLeader).add(user);
} else if (isMember(groupLeader, gMap)) {
  throw new UnsupportedOperationException("Member " + groupLeader + " is not a leader and must not invite " + user);
} else {
  addNewGroup(groupLeader, gMap).add(user);
}

ヘルパー メソッドは次のとおりです。

private boolean isLeader(String player, Map<String, Set<String> gMap) {
  return gMap.keys().contains(player);
}

private boolean isMember(String player, Map<String, Set<String> gMap) {
  for (Set<String> members : gMap.values()) {
    if (members.contains(player)) {
      return true;
    }
  }
  return false;
}

private Set<String> addNewGroup(String leader, Map<String, Set<String> gMap) {
  Set<String> players = new HashSet<>();
  gmap.put(leader, players);
  return players;
}
于 2013-08-27T19:03:22.557 に答える
0

ここにコードサンプルがあります

boolean userIsPartOfGroup = false
for(ArrayList<String> list : gMap.values()){
    if(list.contains(user)){
       userIsPartOfGroup = true;
       break;
    }
}
if(!userIsPartOfGroup){
gMap.add(user).add(new ArrayList(user));
}
于 2013-08-27T18:46:24.953 に答える
0

booleanリストにユーザーが含まれている場合にのみ値を変更する値を使用し、含まれているbreak場合はループから外します。

boolean notInAnyList = true;
for(ArrayList<String> list : gMap.values()){
    if(list.contains(user)){
        notInAnyList = false;
        break; // No point in iterating any further
    }
}

if (notInAnyList) {
    // Handle user not being in any of the lists here
}
于 2013-08-27T18:41:28.273 に答える