Как я могу переопределить next () для зубчатого массива Java? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть зубчатый массив. Как я могу переопределить next(), чтобы получить пошаговые инструкции для его элементов?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Спасибо всем за ваши ответы, я нашел свой ответ на русском языке stackoverflow: https://ru.stackoverflow.com/questions/867881/java-iterator-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0

открытый класс IteratorFor2DArray реализует Iterator {

private int size;
private int i = 0;
private int j = 0;
private int[][] values = new int[i][j];
private int position = 0;

public IteratorFor2DArray(int[][] values) {
    this.values = values;
    this.size = countOfElements(values);
}

private int countOfElements(int[][] values) {
    int count = 0;
    for (int[] row : values) {
        count += row.length;
    }
    return count;
}

@Override
public boolean hasNext() {
    return position < size;
}

@Override
public Integer next() {
    if (position >= size) {
        throw new NoSuchElementException();
    }
    int element = values[i][j];
    position++;
    j++;
    while (i < values.length && j >= values[i].length) {
        j = 0;
        i++;
    }
    return element;
}

}

0 голосов
/ 18 октября 2018

Я также нашел другой способ:

public class IteratorFor2DArray implements Iterator {

    private int[][] data;
    private int i, j;

    public IteratorFor2DArray(int[][] data) {
        this.data = data;
    }

    @Override
    public Integer next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        int element = data[i][j];
        j++;
        while (i < data.length && j >= data[i].length) {
            j = 0;
            i++;
        }
        return element;
    }

    @Override
    public boolean hasNext() {
        return (i < data.length && j < data[i].length);
    }
}
0 голосов
/ 17 сентября 2018

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

int[][] it = {{1,2}, {3,4,5}};

OfInt iterator = Arrays.stream(it).flatMapToInt(x -> IntStream.of(x)).iterator();
iterator.forEachRemaining((IntConsumer) System.out::print);

Потоковый массив с зазубринами, преобразование его в один IntStream и выполнение с ним того, что вы хотите. В этом примере я получил итератор, но вы можете только захотеть:

Arrays.stream(it).flatMapToInt(x -> IntStream.of(x)).forEach((IntConsumer) System.out::print); 

В forEach вы можете делать то, что вам нужно, или использовать какой-то другой метод IntStream

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...