2015-11-17 3 views
0

Я создал два итератора для массива: первый запускает массив по строкам (iteratorRow), а затем по столбцам, а второй, сначала по столбцам, а затем по строкам (iteratorColumn).Итератор и итерабельность для 2D-массива Java

У меня есть еще один класс, Matrix, в котором я должен создать два метода для выполнения итерации (iteratorRowColumn и iteratorColumnRow), которые возвращают итераторы, созданные для доступа к другим классам.

Массив должен реализовывать интерфейс Iterable и может быть сконфигурирован (с использованием логического), который из двух итераторов должен быть возвращен вызовом метода iterator().

Как я могу это сделать? Должен ли я делать некоторые методы получения? Что-то вроде этого?

public Iterator iteratorRowColumn() { 
    return new iteratorRow; 
} 
+1

Возможного дубликата [итератор столбца и строки массива Java] (HTTP: // stackoverflow.com/questions/33714751/iterator-column-and-row-array-java) –

+1

«Массив должен реализовывать интерфейс Iterable и может быть сконфигурирован (с использованием логического), который из двух итераторов должен быть возвращен путем вызова итератора() ". - Вы создаете объект 'new 2DArray (true)' и в зависимости от параметра переопределяемый метод 'iterator()' будет возвращать либо тот или другой. –

ответ

1

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

Массив должен реализовать Iterable интерфейс

public class Matrix<T> implements Iterable<T> 

может быть сконфигурирован (с помощью Boolean)

public Matrix(boolean defaultRowColumnIterator) { 
    this.defaultRowColumnIterator = defaultRowColumnIterator; 
} 

, какой из два итераторами он должен быть возвращающимися с помощью вызова метода

@Override 
public Iterator<T> iterator() { 
    return defaultRowColumnIterator ? iteratorRowColumn() : iteratorColumnRow(); 
} 

Здесь() итератора является компилируемым примером:

public class Matrix<T> implements Iterable<T> { 

    T[][] array; 
    boolean defaultRowColumnIterator; 

    public Matrix(boolean defaultRowColumnIterator) { 
     this.defaultRowColumnIterator = defaultRowColumnIterator; 
    } 

    // other methods and constructors 

    public Iterator<T> iteratorRowColumn() { 
     return null; // your current implementation 
    } 

    public Iterator<T> iteratorColumnRow() { 
     return null; // your current implementation 
    } 

    @Override 
    public Iterator<T> iterator() { 
     return defaultRowColumnIterator ? iteratorRowColumn() : iteratorColumnRow(); 
    } 

} 
0

Что-то вроде этого:

public class Proba { 

    Integer[][] array = new Integer[10][10]; 

    public class MyIter implements Iterator<Integer> { 

     private Integer[] integers; 
     private int index = 0;; 

     public MyIter(Integer[] integers) { 
      this.integers = integers; 
     } 

     @Override 
     public boolean hasNext() { 
      return index < integers.length -1 ; 
     } 

     @Override 
     public Integer next() { 
      return integers[index]; 
     } 

     @Override 
     public void remove() { 
      //TODO: remove 
     } 
    } 

    public static void main(String[] args) { 
     Iterator<Integer> iter = new Proba().getIterator(1); 
     while (iter.hasNext()) { 
      System.out.println(iter.next()); 
     } 
    } 

    public Iterator<Integer> getIterator(int row) { 
     return new MyIter(array[row]); 
    } 
} 
+0

«Массив должен реализовывать интерфейс Iterable» –

+0

Массив не может ничего реализовать. Вы можете создать класс MyArray или Matrix и поместить его в MyIter. Это будет одно и то же. –

+0

Внедряя массив, я думаю, предназначен для реализации класса, который хранит данные в массиве 2d и позволяет перебирать его. В случае вашего кода 'Proba' будет матричным классом и не будет реализовывать интерфейс' Iterable' по мере необходимости. –

Смежные вопросы