Создание Iterable со значениями из другого Iterator / Iterable - PullRequest
0 голосов
/ 18 мая 2018

Я написал ADT Sorted BinaryTree с функцией:

public Iterator<T> getInorderIterator(){
    return new InorderIterator();
}

, которая работает, проходит по дереву по порядку.

Затем у меня есть класс словаря, который использует этот класс дляхранить записи типа Entry<K, V> и функцию, возвращающую Iterable всех записей.

public Iterable<Entry<K, V>> entries() {
    //bST is BinarySortedTree
    return () -> bST.getInorderIterator();
}

Все это работает так, как должно, но я хочу написать еще 2 функции, которые возвращают Iterable ключей и значений в словаре.Как бы я создал эти Iterables из Iterable, возвращенного из entries(), или из вызова getInorderIterator() на BinaryTree.

Класс записи:

public class Entry<K, V> {
    public final K key;
    public final V value;

    public Entry(K key, V value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof Entry) {
            Entry other = (Entry)o;
            return this.key.equals(other.key) && this.value.equals(other.value);
        }
        return false;
    }
}

Я не могу написать итератор в классе BinaryTree, поскольку он использует абстрактные типы данных.

1 Ответ

0 голосов
/ 18 мая 2018

Просто со стандартной библиотекой вы можете сделать

StreamSupport.stream(entries().spliterator(), false).map(entry -> entry.value).iterator()

для значений (очевидное изменение для ключей).Я не знаю, есть ли в Java 9 или 10 более простой способ сделать это.

С Apache Collection Commons

IteratorUtils.transformedIterator(bST.getInorderIterator(), entry -> entry.value)
...