Оценка кода своей реализации TreeSet

430
06 февраля 2017, 15:44

Дали задание создать свою реализацию TreeSet, в котором должны быть методы add(E e) и List<E> get().

Корректно ли мой код иллюстрирует работу TreeSet? Если некорректно, то в чем?

Если хотя бы отчасти корректно, то как мне протестировать, что я создал именно дерево, ведь мой метод get по условию задачи возвращает List?

Реализуемый интерфейс:

public interface Tree<E> extends Iterable<E> {
    boolean add(E e);
    List<E> get();
    int size();
}

Сама реализация:

public class SimpleTreeSet<E> implements Tree<E> {
    private Leaf<E> root;
    private List<E> list;
    private int size = 0;
    public SimpleTreeSet() {
        list = new LinkedList<>();
    }
    @Override
    public boolean add(E e) {
        if (size == 0) {
            return initRootLeaf(e);
        }
        Leaf<E> newNode = new Leaf<>(e);
        Leaf<E> lastNode = findLastLeaf(root, newNode);
        if (lastNode == null) {
            return false;
        }
        // храню элементы для итератора и get
        list.add(newNode.element);
        if (lastNode.compareTo(newNode) > 0) {
            lastNode.right = newNode;
            size++;
            return true;
        } else {
            lastNode.left = newNode;
            size++;
            return true;
        }
    }
    // ищу последний лист дерева
    private Leaf<E> findLastLeaf(
            final Leaf<E> oldLeaf,
            final Leaf<E> newLeaf
    ) {
        Leaf<E> lastLeaf = oldLeaf;
        int compare = oldLeaf.compareTo(newLeaf);
        if (compare > 0 && oldLeaf.right != null) {
            lastLeaf = findLastLeaf(oldLeaf.right, newLeaf);
            return lastLeaf;
        }
        if (compare < 0 && oldLeaf.left != null) {
            lastLeaf = findLastLeaf(oldLeaf.left, newLeaf);
            return lastLeaf;
        }
        if (compare == 0)
            return null;
        return lastLeaf;
    }
    private boolean initRootLeaf(final E e) {
        root = new Leaf<>(e);
        list.add(e);
        size++;
        return true;
    }
    @Override
    public List<E> get() {
        return list;
    }
    @Override
    public int size() {
        return size;
    }
    @Override
    public Iterator<E> iterator() {
        return list.iterator();
    }
    private class Leaf<E> implements Comparable<E> {
        private Leaf<E> right;
        private Leaf<E> left;
        private E element;
        private Leaf(E element) {
            this.element = element;
        }
        @Override
        public int compareTo(Object obj) {
            if (obj instanceof SimpleTreeSet.Leaf) {
                Leaf<E> node = (Leaf<E>) obj;
                return this.hashCode() - node.hashCode();
            }
            throw new ClassCastException();
        }
        @Override
        public int hashCode() {
            int hash = 31;
            hash = hash * 17 + element.hashCode();
            return hash;
        }
    }
}
READ ALSO
Медленный выбор item в RecyclerView

Медленный выбор item в RecyclerView

Есть RecyclerView в виде сетки из квадратовНужно реализовать режим выбора квадрата, то есть при выборе другого квадрата, подсветка у прежнего должна...

500
Изменить код адаптера ListView на RecyclerView

Изменить код адаптера ListView на RecyclerView

Добрый деньНаписал приложение в котором есть ListView и написал для нее адаптер

552
Отображение изображения в html теге

Отображение изображения в html теге

Допустим есть некий код :

445