如何将"Pair"或n-size插入列表集合而不是编写HashMaps?

Ale*_*hov 0 java queue collections map dataset

所以,我有一种情况需要将三个值传递给一个串行的BlockingQueue队列:

(SelectableChannel, ComponentSocketBasis, Integer).
Run Code Online (Sandbox Code Playgroud)

它们实际上根本不需要进行哈希映射,并且使用HashMap是荒谬的,因为每个条目总是只有一个键; 如果他们只是在某种有序的集合中,那就好了.但是,由于缺少已知的替代方法,我在我的实现中使用了HashMap并生成了这个混淆的泛型组合:

private LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>> deferredPollQueue = new LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>>();
Run Code Online (Sandbox Code Playgroud)

这看起来真的很荒谬.我必须是一个可怕的n00b.当然有一种更好的方法可以做到这一点,不需要我在检索值时分解密钥或浪费(理论上 - 实际上,Java总是臃肿:)算法复杂性对无用的哈希计算我不需要因为我的密钥空间为1,甚至不想关联映射三个引用,而只是将它们分组?有了这个实现,我必须这样取出值:

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);
}
Run Code Online (Sandbox Code Playgroud)

我很确定每一个有能力的人都认为这是一种荒谬的方式,所以问题是 - 什么是正确的方法?:)我无法在任何地方找到java.util.Pair或java.util.Triplet的证据.

我认为Orthodox Way(TM)只是为了容纳这个三元组而做一个自定义类或接口,但是对于这么大的系统中的这么小的任务来说,这似乎是荒谬的冗长和不必要的 - 尽管如此,那是Java本身.

出于同样的原因,也许这些值可以放在ArrayList或Vector或它们的衍生物上,但是在Java中,这并没有比我从这个HashMap中获得更简洁的解决方法,尽管它确实解决了也许是算法复杂性问题.

回到Perl land,我们只需使用数组引用作为数组内的值:

push(@$big_queue_array, [$elem1, \%elem2, \@elem3]);
Run Code Online (Sandbox Code Playgroud)

什么是Java中最好的等价物?

Jee*_*Bee 5

为什么不创建自己的通用Pair或Triple类?几乎每个Java 5+项目最终都将它们放在自己的util类中!

  • 如果这三个对象在一起是一个常见的数据项,那么我就有一个特定的类.如果它们仅存在于系统的一个部分中,特别是在单个类中,则Triplet就足够了.如果您在系统的其他位置使用Triplet,那么至少代码将被重用.如果您稍后可能会添加更多字段,那么创建特定类将变得更加可取.如果它在API级别可见,则再次需要特定类(并且对API文档的评论更好). (2认同)