0

したがって、シリアル 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で最も同等のものは何ですか?

4

4 に答える 4

5

独自のジェネリック ペアまたはトリプル クラスを作成してみませんか? ほとんどすべての Java 5 以降のプロジェクトでは、それらを独自の util クラスに含めることになります!

于 2009-05-07T15:35:19.457 に答える
2

どのオブジェクトがどの場所にあるかがわかっているので、ArrayList を使用してオブジェクトを格納することもできます。のメンバ SelectableChannel および ComponentSocketBasis を使用して新しいクラスを作成する方がおそらく良いでしょう。

この種のことを頻繁に行う場合は、一般的なペアまたはタプルを作成すると多くの時間を節約できますが、それを使用する場所がこれだけである場合は、新しいクラスを使用すると、コードがはるかに読みやすくなります。

コード内でクラス名を見れば、それが何のためにあるのか正確にわかりますが、一般的な合併だけを見ると、あなた (または他の誰か) がそれが何のために使用されているのかを理解するのが難しくなる可能性があります。

これは、プログラミング時間と読みやすさの間のトレードオフです。

于 2009-05-07T15:58:02.380 に答える