Java итератор - PullRequest
       28

Java итератор

1 голос
/ 22 мая 2009

Я новичок, у меня вопрос.

У меня есть карта. Я должен пройти по карте и построить итератор.

Пример:

public Iterable<Test> getTests(Map<String, Test> testMap,
    Set<String> strings)
{
    //loop tru the set of strings and build iterator.
    for(final String test1 : strings)
    {

       Test test = testMap.get(test1);

       //build a iterator. not a list.
    }

    return iterator
}

Как я могу это сделать?

Ответы [ 6 ]

6 голосов
/ 22 мая 2009

Прежде всего, ваш метод возвращает Iterable, а не Iterator. Map, Set и List все реализуют Iterable, так что это может быть проще, чем вы думаете.

Во-вторых, Iterable - это просто класс, имеющий метод iterator(), который возвращает Iterator.

Так что я просто собрал бы List результатов и затем вернул бы его. Если вы действительно хотите вернуть Iterator, я бы вместо этого позвонил iterator() в списке и вернул бы , что .

3 голосов
/ 22 мая 2009

Пропуск вашей путаницы Iterator / Iterable (а Iterable - это, по сути, фабрика Iterator ... поэтому вам нужно написать Iterator в любом случае), я думаю, вы имеете в виду что-то подобное:

Iterator<Test> getTests(final Map<String,Test> testMap, final Set<String> strings) {
    return new Iterator<Test>() {
      private final Iterator<String> keyIter = strings.iterator();
      private String lastKey;
      public boolean hasNext() { return keyIter.hasNext(); }
      public Test next() { lastKey = keyIter.next(); return testMap.get(lastKey); }
      public void remove() { testMap.remove(lastKey); }
    };
  }

И если вы хотите вернуть Iterable, ну, это просто фабрика для тех:

Iterable<Test> getTests(final Map<String,Test> testMap, final Set<String> strings) {
    return new Iterable<Test>() {
        public Iterator<Test> iterator() {
            return new Iterator<Test>() {
                private final Iterator<String> keyIter = strings.iterator();
                private String lastKey;
                public boolean hasNext() { return keyIter.hasNext(); }
                public Test next() { lastKey = keyIter.next(); return testMap.get(lastKey); }
                public void remove() { testMap.remove(lastKey); }
              };
        }
    };
}

Для дополнительного кредита, вы можете параметризовать сам этот метод и иметь общий способ перебора выбора на карте:

Map<String, Action> map;
Set<String> keys;
for (Action x : filterMap(map, keys)) {
}
2 голосов
/ 22 мая 2009

Поскольку Collection расширяет Iterable, правильным решением было бы добавить тесты в какую-то коллекцию, например ArrayList.

Collection<Test> tests = new ArrayList<Test>();
for (String key : strings) {
  Test t = testMap.get(key);
  if (t != null)
    tests.add(t);
}
return tests;
1 голос
/ 22 мая 2009

Как удар в темноте, вы можете искать Map.entrySet.iterator(). Позволяет перебирать записи на карте.

Примечание: я знаю, что это не ответ на вопрос ОП, но я думаю, что отвечу на то, что они на самом деле ищут. Если это предположение окажется неверным, я снова удалю этот ответ, чтобы избавить людей от путаницы.

1 голос
/ 22 мая 2009

Если вы действительно хотите вернуть Iterable, то самый простой способ - это

public Iterable<Test> getTests(Map<String, Test> testMap, Set<String> strings)
{
   testMap = new HashMap<String, Test>(testMap);
   testMap.keySet().retainAll(strings);
   return testMap.values();
}

Если вы хотите вернуть итератор, замените последнюю строку на

return testMap.values().iterator();

Если вас не интересуют модификации переданной карты, пропустите начальную конструкцию временной карты.

EDIT: удалено использование клона в интерфейсе карты, у которого его нет.

0 голосов
/ 22 мая 2009

Итератор отличается от Итератор . Итерируемый - это то, что вы можете перебирать, например, список. Вы используете Итератор для этого. Ваши вопросы не ясны о том, что вы хотите вернуть из getTests ().

Лучше всего было бы создать Iterable (например, List или Vector) и вернуть его или вернуть его Iterator.

...