1

Guava を使って練習しようとしていますが、問題に遭遇しました。見つけた解決策に満足していません。

私の状況では、ユーザーとサーバーごとに id を設定しています。if statement blockGuava Table による信じられないほどの単純化にもかかわらず、構築テーブルのループ内にはまだ問題があります。

  Table<Integer, Integer, Set> setPerUser = HashBasedTable.create();

  for(Conversation conversation : conversations) {
     Set uci = setPerUser.get(conversation.x, conversation.y);
     if(uci == null) {
        uci = new HashSet();
        setPerUser.put(conversation.x, conversation.y, uci);
     }
     uci.add(conversation.id);
  }

私は間違った方向に進んでいるようで、 if ステートメントが状況を警告しています。Ok、

  1. FluentIterator などのイテレータをテーブルに変換するより良い方法はありますか?

  2. ThreadLocal や Guava Supplier などの初期値メソッドがあるとどう思いますか?

ありがとう

4

2 に答える 2

0

もう 1 つの可能性は、x と y の両方を保持する「キー」クラスを定義することです。次に、次を使用できますMultimap

final class ConversationId {
  private final Integer userId;
  private final Integer serverId;

  // constructor, equals(), hashCode() ...
}

SetMultimap<ConversationId, V> conversationsById = HashMultimap.create();
// populate...

を作成してデータを入力するコードは、 にMultimapよく似ていMultimaps.indexます。代わりにそれを呼び出すことができます:

Multimap<ConversationId, V> conversationsById = Multimaps.index(conversations, idFunction());

single-keyedMultimapは double-keyed のすべての機能を提供するわけではありませんがTable、ユースケースには問題ない場合があります。Tableなどの複雑なビューで主に役立ちます。row()column()get()size()、およびのような単純な用途では、values().iterator()で十分ですMultimap

于 2012-12-11T17:30:32.457 に答える