代码之家  ›  专栏  ›  技术社区  ›  Alex Balashov

如何将“pair”或n-size插入列表集合而不是组成哈希映射?

  •  0
  • Alex Balashov  · 技术社区  · 17 年前

    因此,在这种情况下,我需要将三个值传入串行阻塞队列队列:

    (SelectableChannel, ComponentSocketBasis, Integer).
    

    它们实际上根本不需要散列映射,使用散列映射是荒谬的,因为每个条目总是只有一个键;如果它们只是在某种有序的集合中,那就没问题了。然而,由于缺乏已知的替代方案,我在实现中使用了散列图,并生成了这种模糊的泛型组合:

    private LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>> deferredPollQueue = new LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>>();
    

    这似乎真的很荒谬。我必须是一个可怕的N0B。当然,有一个更好的方法来做到这一点,不需要我在检索值时分解密钥或者浪费(理论上在实践中,Java总是臃肿:)算法复杂度在一个无用的散列计算上,我不需要,因为我有一个1的密钥空间,甚至不想在第二个关系图上映射。REE引用,但仅仅是对它们进行分组?通过这个实现,我必须彻底地提取出以下值:

    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本身。

    出于同样的原因,也许这些值可以放在一个数组或向量或导数中,但是在爪哇,这并不比HashMap从这里得到的更简洁的解决方法,尽管它确实解决了算法复杂性问题。

    回到PerlLand中,我们只需使用数组引用作为数组中的值:

    push(@$big_queue_array, [$elem1, \%elem2, \@elem3]);
    

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

    4 回复  |  直到 17 年前
        1
  •  5
  •   JeeBee    17 年前

    为什么不创建自己的泛型对或三类呢?几乎每一个Java 5 +项目最终都在他们自己的UTL类中!

        2
  •  4
  •   skaffman    17 年前

    你说一个保存三元组的定制类将会膨胀并且没有必要,但是这确实是实现它的方法,这就是面向对象建模的工作方式。自定义类是显式的和可读的,与一般的holder类相比,它占用的运行时资源不多。

        3
  •  2
  •   Apocalisp    17 年前

    Functional Java pairs , triplets ,并元组到arity 8。还有一种叫 HList 为了自由主义。所以你的类型是:

    LinkedBlockingQueue<P3<SelectableChannel, ComponentSocketBasis, Integer>>
    

    这只是一个库,所以把jar放到类路径中,你就可以走了。

        4
  •  2
  •   Chad Okere    17 年前

    您可以使用ArrayList来存储对象,因为您知道哪个对象将位于哪个位置。使用的成员selectablechannel和componentsocketbasis创建新类可能会更好。

    如果你要经常做这类事情,那么现在创建一个通用的对或元组会节省很多时间,但是如果这是你唯一要使用它的地方,那么创建一个新的类会使代码更容易阅读。

    每当你在代码中看到你的类名,你就会知道它是用来做什么的,而如果你只是看到你的通用合并,你(或其他人)可能很难理解它是用来做什么的。

    这是编程时间和可读性之间的权衡。

    推荐文章