Как я могу вернуть Iterable с функцией? - PullRequest
1 голос
/ 22 мая 2019

У меня есть объекты, содержащие имя и возраст людей.Затем я создал хеш-таблицу, содержащую эти объекты.Я написал свои собственные интерфейсы под названием PeopleIterator и PeopleIterable и реализацию Iterator для этой хеш-таблицы.Это все работает просто отлично.

Теперь мне нужно написать функцию в этом хеш-таблице, которая возвращает другой интерфейс с именем StringIterable, который содержит имена всех людей.

Я могу использовать структуру данных из Collections Framework и помощниказанятия, если они мне нужны, но я даже не знаю с чего начать.

public class PeopleHashtable implements PeopleIterable{
    private People[] people;

    public StringIterable copyNames() {

    }
}


public interface StringIterable extends java.lang.Iterable<String> {
    StringIterator iterator();
}

Ответы [ 3 ]

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

Реализуйте интерфейс Iterator, предоставив реализации для next() и hasNext().

hasNext () просто возвращает true или false, если у вас есть другой элемент для возврата.Это может быть так же просто, как проверка текущего индекса массива по длине массива.

next () просто возвращает элемент с этим индексом и увеличивает индекс.

Вот пример шаблона.

class MyClass implements Iterator<String> {
   String[] foo ...;
   private int index;
   public Iterator<String> iterator() {
      index = 0;
      return this;
   }

   public boolean hasNext() {
      //your code
   }

   public String next() {
      //your code
   }
}
0 голосов
/ 22 мая 2019

Я думаю, вы неверно истолковали требования. Я думаю, что copyNames на самом деле должен возвращать Iterator<String>, а не Iterable. Iterable - это то, что вы называете iterator(), чтобы получить Iterator.

И я также согласен с тем, что комментарий Джона Клугемана является правильным. Не рекомендуется объявлять пользовательские интерфейсы, такие как PeopleIterable и StringIterable. Они не помогают.

В любом случае, вот краткая реализация для copyNames (неправильный выбор имени метода!), Предполагающая, что он возвращает Iterator, а не Iterable.

public Iterator<String> copyNames() {
    return Arrays.stream(people).map(p -> p.getName()).iterator();
}

Если вам действительно нужен Iterable ....

public Iterable<String> copyNames() {
    return new Iterable<String>() {
        public Iterator<String> iterator() {
            return Arrays.stream(people).map(p -> p.getName()).iterator();
        }
    }
}
0 голосов
/ 22 мая 2019

набор и список являются итеративными. так что, возможно, просто верните что-то вроде map.keySet ().

related: Массивы, списки, множества и карты являются итеративными. Что еще?

...