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中最好的等价物?
为什么不创建自己的通用Pair或Triple类?几乎每个Java 5+项目最终都将它们放在自己的util类中!