Предоставить итератор для содержимого двух списков одновременно? - PullRequest
27 голосов
/ 29 июня 2010

Предположим, у меня есть это:

public class Unit<MobileSuit, Pilot> {

    ...

    List<MobileSuit> mobileSuits;
    List<Pilot> pilots;

    ...
}

И я бы хотел перебрать пару каждого из них самым простым способом вне этого класса.Как мне это сделать?Я думал о том, чтобы сделать это:

public class Unit<MobileSuit, Pilot> {

    ...
    Iterator<MobileSuit> iteratinMechas;
    Iterator<Pilot> iteratinPeople;

    class IteratorCustom<MobileSuit, Pilot> implements Iterator {

        public boolean hasNext() {
            return iteratinMechas.hasNext() && iteratinPeople.hasNext();
        }

        public void remove() {
            iteratinMechas.remove();
            iteratinPeople.remove();
        }

        public Object next() {
            // /!\
        }

    }

    public Iterator iterator() {
        return new IteratorCustom<MobileSuit, Pilot>(mobileSuits, pilots);
    }
}

Что-то в этом роде.

В любом случае, проблема в том, что я не могу действительно вернуть только один объект из next (), и я такжеИтератор не может принимать более одного типа.Итак, есть мысли?

Кроме того, я не могу создать новый класс для объединения MobileSuit и Pilot.Мне нужно держать их отдельно, хотя я перебираю оба одновременно.Причина в том, что могут быть мобильные костюмы, в которых нет пилотов, и я не уверен, как это исправить, сохранив их в одном классе.Этот класс должен быть обработан в других местах, поэтому я должен был бы объединить интерфейс вокруг этого и многих других вещей.Предположим, что MobileSuit и Pilot должны быть разделены.

Ответы [ 11 ]

0 голосов
/ 29 июня 2010

Вы можете просто использовать Map<MobileSuit, Pilot>, где значение null, сопоставленное с MobileSuit, означает отсутствие пилота.Iterator может быть просто Iterator<Map.Entry<MobileSuit, Pilot>>, полученным map.entrySet().iterator().

...