如何"重置"迭代枚举列表

时间:2014-10-01 18:47:58

标签: java enumeration

Enumeration<NetworkInterface> nets
        = NetworkInterface.getNetworkInterfaces();

out.print("List of all network interfaces on this machine:\n");

for (NetworkInterface netint : Collections.list(nets)) {
    out.printf("name:%s (%s)\n", netint.getName(), netint.getDisplayName());
}

我正在做一项要求我使用NetworkInterface列出大量信息的作业,但我对Enumeration不太熟悉,所以我遇到了麻烦。

我经历了一些javadocs并成功实现了这一目标。问题是我需要能够多次浏览列表。

例如,我想要使用另一个for循环来循环并列出当前运行的所有接口。

这样的事情:

for (NetworkInterface netint : Collections.list(nets)) {
    if (netint.isUp()) {
       out.printf("name:%s (%s)\n", netint.getName(), netint.getDisplayName());
    }
}

但是,任何时候我在第一个之后使用for循环我都没有得到任何输出。我觉得这与我缺乏理解有关。我似乎无法在任何地方找到解释。

3 个答案:

答案 0 :(得分:3)

无法重置枚举。您的代码无法正常工作的原因是您第一次拨打Collections.list(nets)&#34;耗尽&#34; nets枚举,因此下一次调用Collections.list(nets)会产生一个空集合。

要避免这种情况,请从nets枚举中收集接口,然后迭代结果列表:

List<NetworkInteface> list = Collections.list(nets);

// Iteration 1
for (NetworkInterface netint : list) {
    ...
}

// Iteration 2
for (NetworkInterface netint : list) {
    ...
}

答案 1 :(得分:2)

您需要:

  • 在每个循环之前重新调用NetworkInterface.getNetworkInterfaces()(以便获得新的Enumeration对象);或
  • NetworkInterface.getNetworkInterfaces()的结果存储在列表中一​​次,然后迭代该列表。

说明第二种方法:

List<NetworkInterface> nets = Collections.list(
                                 NetworkInterface.getNetworkInterfaces());

for (NetworkInterface netint : nets) {
   ...
}

for (NetworkInterface netint : nets) {
   ...
}

答案 2 :(得分:0)

尝试使用Iterator而不是Enumeration。 参考这个文档,  http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html