繁体   English   中英

过滤HashMap的条目并遍历值

[英]filtering entries of HashMap and iterate over values

我使用了HashMap来实现图形

HashMap<E,Node<E>> graph=new HashMap<E,Node<E>>()

现在我想从中过滤出头节点(Node类有一个显示该节点是头还是尾的方法)

public Iterator<Node<E>> heads() {
    HashMap<E, Node<E>> heads=new HashMap<E, Node<E>>();
    for(Entry<E, Node<E>> e:graph.entrySet()){
        if(e.getValue().isHead())
            heads.put(e.getKey(), e.getValue());
    }
    return heads.values().iterator();
}

我想知道这是一种好的实施方式还是有更好的适当方式?

不知道您在寻找“更好”的哪个方面。 无论如何,您的方式都行得通。

我更喜欢使用Guava的Iterables

它看起来像:

Iterable<Node<E>> heads 
     = Iterables.filter(graph.values(), 
                        new Predicate<Node<E>> {
                            @Override
                            public boolean apply(Node<E> node) {
                                return node.isHead();
                            }
                       );

编辑:如果您使用的是Java 8,那么您将找到没有第三方库的类似功能。 多亏了Lambda,语法更加容易。 无论如何,想法是一样的。

对您发布的算法的直接改进是将地图的head元素收集到列表中,而不是仅在其中包含head元素的情况下重建HashMap

public Iterator<Node<E>> heads() {
    List<Node<E>> heads = new ArrayList<>();
    for (Node<E> e : graph.values()) {
        if (e.isHead())
            heads.add(e);
    }
    return heads.iterator();
}

Java 8版本:

Iterator<Node> s = graph.values().stream().filter(n -> n.isHead()).iterator();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM