Доступ к данным в наборе в 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() на множестве может вернуть его