我使用了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();
}
我想知道这是一种好的实施方式还是有更好的正确方法?
答案 0 :(得分:3)
不知道&#34;更好&#34;你在找。无论如何,你的方式都有效。
通过使用Guava&#39; 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,语法更容易。无论如何,这个想法是一样的。
答案 1 :(得分:2)
对您发布的算法的一个简单改进是将地图的头元素收集到一个列表中,而不是只用其中的头元素重建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();
}
答案 2 :(得分:1)
Java 8版本:
Iterator<Node> s = graph.values().stream().filter(n -> n.isHead()).iterator();