2

我有一个精简版的 Java 1.4.2,它没有 Iterator 类。我正在尝试移植 T2Framework 源以便能够在此目标上运行,但是,我遇到了以下代码行:

for (Class D : domainMap.keySet())

其中 domainMap 的类型为 java.util.HashMap。到目前为止,对于我在这个源代码中遇到的所有其他迭代器,我已经能够使用带有索引的 for 循环来解决无法使用迭代器的问题,但是,Java 中的 Set 不允许你按索引引用其数据。是否有另一种方法可以访问 Set 中的数据?

4

5 回答 5

4

你可以toArray,然后在该数组上使用 for 循环:

Object[] array = domainMap.keySet().toArray();
for (int i = 0; i < array.length; i++) {
    Object o = domainMap.get(array[i]);

    // Body of loop here
}
于 2011-08-04T18:24:42.177 回答
4

你没有的是使用的“增强的 for 循环”,IterableIteratorv1.2 起就在 Java 中

您可以替换每次出现的

for( Object o : collection ) { 
}

for( Iterator i = collection.iterator(); i.hasNext() ; ) {
   Object o = i.next(); 
}

前者只是后者的语法糖(见编译代码)。

看:

C:\>more > A.java
class A {
   void m() {
      for( Object o : new java.util.HashSet() ) {
      }
   }
}
^C
C:\>javac A.java

C:\>more > B.java
class B {
   void m() {
      for( java.util.Iterator i = new java.util.HashSet().iterator() ; i.hasNext() ; ) {
         Object o = i.next();
      }
   }
}
^C
C:\>javac B.java

C:\>gvim -d a.d b.d

差异

相同!

于 2011-08-04T18:32:19.907 回答
2

我会建议:

a) 创建您自己的 java.util.Iterator 类并将其放入 java.util 包中。

或者

b) 使用 Set.toArray() 函数对您有利。

将集合转换为数组后,迭代它就很简单了。

(如果这是唯一的困难,我会选择 b,如果这个问题有多个实例,我会选择 a)

示例 Set.toArray():

Object[] myArray = myMap.keySet().toArray();
for(int i = 0; i < myArray.length; i++)
    doStuff((Class)myArray[i]);

如何制作自己的 java.util.Iterator:

使用此处的代码并将该类添加到您的类路径中。

于 2011-08-04T18:27:06.703 回答
1

你有枚举吗,它就像前通用时代的迭代器。Set 上的 elements() 方法可能会返回它

于 2011-08-04T18:29:55.233 回答
1

我不明白......自java 1.2以来就有迭代器。

1)您的示例显示了 for 循环的新语法...在 1.4.2 中不起作用 2)我相信您可以做到

Iterator it = mySet().iterator();

并像其他响应一样循环通过它。

编辑:好的,刚刚看到你的新评论......所以你真的没有迭代器!好吧... toArray 实际上是最好的方法

于 2011-08-04T18:35:47.463 回答