Доступ к данным в наборе в Java без использования итератора - PullRequest
2 голосов
/ 04 августа 2011

У меня есть урезанная версия Java 1.4.2, в которой нет класса Iterator. Я пытаюсь перенести исходный код T2Framework для выполнения на этой цели, однако натолкнулся на следующую строку кода:

for (Class D : domainMap.keySet())

где domainMap имеет тип java.util.HashMap. Для каждого другого итератора в этом источнике, с которым я сталкивался до сих пор, я смог использовать цикл for с индексом, чтобы решить проблему невозможности использования итератора, однако Set in Java не позволяет вам ссылаться на свои данные по индексу. Есть ли другой способ доступа к данным в наборе?

Ответы [ 5 ]

4 голосов
/ 04 августа 2011

Чего вам не хватает, так это «расширенного цикла for», который использует Iterable, Iterator в Java, поскольку v1.2

Вы можете заменить любое вхождение

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

diff

То же самое!

4 голосов
/ 04 августа 2011

Вы можете 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
}
2 голосов
/ 04 августа 2011

Я бы предложил:

a) Создать свой собственный класс java.util.Iterator и поместить его в пакет java.util.

ИЛИ

b)Использование функции Set.toArray () в ваших интересах.

Как только вы преобразовали набор в массив, перебирать его тривиально.

(я бы пошел с b, еслиэто единственная трудность, если существует более одного экземпляра этой проблемы)

Пример Set.toArray ():

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

Как создать свой собственный java.util.Iterator:

Используйте код из здесь и добавьте этот класс в ваш путь к классам.

1 голос
/ 04 августа 2011

Я не понимаю ... Итератор существует начиная с java 1.2.

1) Ваш пример показывает новый синтаксис цикла for ... не будет работать в 1.4.2 2) Яуверен, что вы можете сделать

Iterator it = mySet().iterator();

и выполнить цикл, как и другие ответы.

edit: ок только что увидел ваш новый комментарий ... Так что у вас действительно нетитератор !!!ну ... на самом деле toArray - лучший способ сделать это

1 голос
/ 04 августа 2011

У вас есть Перечисление, это было похоже на Итераторы в предварительные дни. Метод elements () в Set может вернуть его

...