当前位置: 首页 > 知识库问答 >
问题:

我可以在Java中使用for each遍历节点列表吗?

陈成济
2023-03-14

我想在Java中使用for-each循环迭代节点列表。我有一个for循环和do-while循环,但不是每个循环都有。

NodeList nList = dom.getElementsByTagName("year");
do {
    Element ele = (Element) nList.item(i);
    list.add(ele.getElementsByTagName("MonthId").item(0).getTextContent());
    i++;
} while (i < nList.getLength());

NodeList nList = dom.getElementsByTagName("year");

for (int i = 0; i < nList.getLength(); i++) {
    Element ele = (Element) nList.item(i);
    list.add(ele.getElementsByTagName("MonthId").item(0).getTextContent());
}

共有3个答案

徐经武
2023-03-14
public static Iterable<Node> iterable(final NodeList n) {
  return new Iterable<Node>() {

    @Override
    public Iterator<Node> iterator() {

      return new Iterator<Node>() {

        int index = 0;

        @Override
        public boolean hasNext() {
          return index < n.getLength();
        }

        @Override
        public Node next() {
          if (hasNext()) {
            return n.item(index++);
          } else {
            throw new NoSuchElementException();
          }  
        }

        @Override
        public void remove() {
          throw new UnsupportedOperationException();
        }
      };
    }
  };
}
茅星华
2023-03-14

我知道聚会已经很晚了,但是...
从Java-8开始,您可以使用lambda表达式(用于创建新的Iterable)和默认方法(用于Iterator.remove)更简洁地编写@RayHulha的解决方案

public static Iterable<Node> iterable(final NodeList nodeList) {
    return () -> new Iterator<Node>() {

        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < nodeList.getLength();
        }

        @Override
        public Node next() {
            if (!hasNext())
                throw new NoSuchElementException();
            return nodeList.item(index++); 
        }
    };
}

然后像这样使用它:

NodeList nodeList = ...;
for (Node node : iterable(nodeList)) {
    // ....
}

或等效如下:

NodeList nodeList = ...;
iterable(nodeList).forEach(node -> {
    // ....
});
孟璞
2023-03-14

这个问题的解决方法很简单,谢天谢地,您只需实现一次。

import java.util.*;
import org.w3c.dom.*;

public final class XmlUtil {
  private XmlUtil(){}

  public static List<Node> asList(NodeList n) {
    return n.getLength()==0?
      Collections.<Node>emptyList(): new NodeListWrapper(n);
  }
  static final class NodeListWrapper extends AbstractList<Node>
  implements RandomAccess {
    private final NodeList list;
    NodeListWrapper(NodeList l) {
      list=l;
    }
    public Node get(int index) {
      return list.item(index);
    }
    public int size() {
      return list.getLength();
    }
  }
}

一旦您将此实用程序类添加到您的项目中,并将XmlUtil.asList方法的静态导入添加到您的源代码中,您就可以像这样使用它:

for(Node n: asList(dom.getElementsByTagName("year"))) {
  …
}
 类似资料:
  • 问题内容: 我想在Java中使用for-each循环进行迭代。我有一个for循环和一个do-while循环,但没有for-each。 问题答案: 此问题的解决方法很简单,值得庆幸的是,您只需实现一次即可。 在将此实用程序类添加到项目中并 为源代码添加方法的后,您可以像这样使用它:

  • 问题内容: 我了解在Java中,不应在遍历Java时对其进行修改,例如删除或添加元素。但是,如何更改列表中的元素呢?例如,如果我们有 因此,我不是在谈论修改存储在某个元素上的对象;我说的是改变对象是 什么 。List的大小未更改,但是索引处的对象正在更改,因此从技术上讲,List也在被修改。我的老板声称此代码很好(并且确实可以正常工作),但我仍然认为它是不正确的。是否可以使用ListIterato

  • 问题内容: 我可以在varArgs上使用还是在varArgs上使用? 问题答案: 变量参数的行为与数组相似,因此您可以使用来获取变量变量中的一个: 您可以使用以下方法遍历它们:

  • 输入是一个列表列表。请看下面。文件名是一个列表,包含的名称与列表中的列表数量相同(,,) 每个名称都附加到路径中:-- 程序在遍历列表时遍历包含路径的列表,并打印路径及其文件名。我希望输出是--。然而,我得到了下面的输出。请查看输入后的输出 输入 输出 我希望输出是-- 然而,我得到的结果如下: 我无法理解为什么在遍历列表时不能使用文件名遍历路径列表。我希望这有助于澄清问题。有人能帮忙吗? 我已经

  • 我正在编写一段C代码来执行有向图的广度优先遍历。 在main函数中,我总共定义了7个节点,并在它们之间建立了连接。一个节点是包含名称、值和所有子节点列表的结构。 我调用函数breadthFirstTraverse(constNode 我的主要问题是,深层节点的列表似乎为空,即使子节点已添加到其中。 节点: 节点: 遍历函数: 这是输出。您可以看到,node2和node3没有子节点,即使节点被添加到

  • 我有一个自定义对象列表(