したがって、シリアル BlockingQueue キューに 3 つの値を渡す必要がある状況があります。
(SelectableChannel, ComponentSocketBasis, Integer).
実際にはハッシュ マップする必要はまったくありません。各エントリに対して常に 1 つのキーしか存在しないため、HashMap を使用するのはばかげています。それらがある種の順序付けられたセットに含まれていれば問題ありません。ただし、既知の代替手段がないため、実装で HashMap を使用し、この難読化されたジェネリック構成を作成しました。
private LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>> deferredPollQueue = new LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>>();
これは本当にばかげているようです。私はひどいn00bでなければなりません。確かに、これを行うには、値を取得するときにキーを分解する必要がない、または必要のない無駄なハッシュ計算のアルゴリズムの複雑さを無駄にする(理論的には--実際には、Javaは常に肥大化しています:)必要のない、より良い方法があります。私は 1 のキー スペースを持っていて、3 つの参照を関係的にマップすることさえしたくなく、単にそれらをグループ化するためですか? この実装では、次のように値を引き出す必要があります。
while(deferredPollQueue.size() > 0) {
System.out.println("*** Draining new socket channel from queue");
HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer> p = deferredPollQueue.take();
SelectableChannel chan = null;
ComponentSocketBasis sock = null;
int ops = 0;
HashMap<SelectableChannel, ComponentSocketBasis> q = p.keySet().iterator().next();
chan = q.keySet().iterator().next();
sock = q.get(chan);
ops = p.get(q).intValue();
SelectionKey k = chan.register(selector, ops);
if(!channelSupervisorMap.containsKey(k))
channelSupervisorMap.put(k, sock);
}
私は、ここで知的な理性を持つことができるすべての人が、おそらくこれはばかげた方法だと考えていると確信しています。:) java.util.Pair または java.util.Triplet の証拠がどこにも見つかりません。
オーソドックスな方法(TM)は、このトリプレットを格納するためだけにカスタム クラスまたはインターフェイスを作成することだと思いますが、このような大規模システムでのこのような小さなタスクの場合、これは途方もなく冗長で不必要に思えます。それはJavaそのものです。
同様に、おそらく値を ArrayList または Vector またはその派生物に入れることができますが、Java では、この HashMap から取得するよりも簡潔な方法でそれらをアドレス指定することはできません。おそらくアルゴリズムの複雑さの問題です。
Perl の世界に戻ると、配列参照を配列内の値として使用することでこれを行うだけです。
push(@$big_queue_array, [$elem1, \%elem2, \@elem3]);
Javaで最も同等のものは何ですか?