Iterator, Iterable java

42
17 января 2021, 17:30

Использовать типизированный класс ArrManager, В котором находится инкапсулированный массив типа данных Object[] и реализованны интерфейсы Iterable, Iterator.

Создать Класс который реализует итератор для перебора внутреннего массива объектов от начала до конца.

Этот итератр должен в конструкторе принимать позиции начала и конца перебора.

Если значение начала меньше нуля то в итераторе оно должно заменятся на 0.

Если значение конца больше размера то оно заменяется на значение размера.

main :

public class Home_work_Iterator_Iterable {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       ArrManager<Integer> arm = new ArrManager<>(new Integer[]{1,2,3});
        System.out.println(arm.toString());

    }
}

Arrmanger class :

import java.util.Iterator;
/**
 *
 * @author Pivar
 * @param <T>
 */
public class ArrManager<T> implements Iterator<T>, Iterable<T> {
    private Object[] data;
    private int size;
    public ArrManager() {
    }
    public Object[] getData() {
        return data;
    }
    public void setData(Object[] data) {
        this.data = data;
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
    public T get(int index) {
        if (index >= 0 && index < size) {
            return (T) data[index];
        }
        return null;
    }

    @Override
    public String toString() {
        return "ArrManager{" + "data=" + data + ", size=" + size + '}';
    }
    @Override
    public boolean hasNext() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    @Override
    public T next() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    @Override
    public Iterator<T> iterator() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

ArrmanagerIterator class:

import java.util.Iterator;
/**
 *
 * @author Pivar
 * @param <T>
 */
public class ArrManagerIterator<T> implements Iterator<T> {
    private int cursor;
    private ArrManager arm;
    private int cursor_Start;
    private int cursor_End;
    public ArrManagerIterator(ArrManager<T> arm, int cursor_Start, int cursor_End) {
        this.arm = arm;
        this.cursor_Start = (cursor_Start < 0) ? 0 : cursor_Start;
        this.cursor_End = (cursor_End > arm.getSize() - 1) ? arm.getSize() - 1 : cursor_End;
        this.cursor = this.cursor_Start;
    }
    @Override
    public boolean hasNext() {
        if (cursor >= cursor_Start && cursor <= cursor_End) {
            return true;
        }
        this.cursor = cursor_Start;
        return false;
    }
    @Override
    public T next() {
        return (T) arm.get(cursor++);
    }
}

У меня не получается вывести массив что бы проверить правильно ли по заданию. Да и вообщем нужна помощь, мне кажется что то я сделал не так =(

Answer 1

Чтобы ваш метод toString работал как задумано, нужно в нём выводить все элементы внутреннего массива, который хранит данные, например, так:

@Override
    public String toString() {
        String arrayData = Arrays.toString(data);
        return "ArrManager{" + "data=" + arrayData + ", size=" + size + '}';
    }
Answer 2
import java.util.Arrays;
import java.util.Iterator;
public class ArrManager<T> implements Iterable<T> {
    private final T[] data;
    public ArrManager(T[] t) {
        this.data = t;
    }
    @Override
    public String toString() {
        return "ArrManager{" + "data=" + Arrays.toString(data) + ", size=" + data.length + '}';
    }
    @Override
    public Iterator<T> iterator() {
        return new ArrManagerIterator<>(0, data.length);
    }
    private class ArrManagerIterator<T> implements Iterator<T> {
        private final int cursorStart;
        private final int cursorEnd;
        private int cursor;
        public ArrManagerIterator(int cursorStart, int cursorEnd) {
            this.cursorStart = (cursorStart < 0) ? 0 : cursorStart;
            this.cursorEnd = (cursorEnd > data.length - 1) ? data.length - 1 : cursorEnd;
            this.cursor = this.cursorStart;
        }
        @Override
        public boolean hasNext() {
            return cursor <= cursorEnd;
        }
        @Override
        public T next() {
            return (T) data[cursor++];
        }
    }
}

public class Home_work_Iterator_Iterable {
    public static void main(String[] args) {
        ArrManager<Integer> arm = new ArrManager<>(new Integer[]{1, 2, 3});
        Iterator<Integer> i = arm.iterator();
        while(i.hasNext()) System.out.println(i.next());
        System.out.println(arm.toString());
    }
}