Доступ к данным в наборе в Java без использования итератора

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

for (Class D : domainMap.keySet())

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

5 ответов

Решение

Вы можете 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
}

То, что у вас нет, это "расширенный цикл", который использует Iterable, Iterator находится в Java начиная с версии 1.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

разница

Такой же!

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

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

ИЛИ ЖЕ

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

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

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

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

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

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

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

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

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

Iterator it = mySet().iterator();

и цикл через него, как другие реагируют.

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

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

Другие вопросы по тегам