Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Problemas iterador y iterable en matriz 2D

Hola,

Quiero sumar dos matrices usando Iteradores para aprender a usarlos, pero me he encontrado con varios problemas.

He creado una clase que representa el funcionamiento básico de una matriz de enteros. La matriz podrá crearse indicando el número de las y de columnas o a partir de un array bidimensional que se le pase por parámetro.

import java.util.Iterator;

public class Matriz implements Iterable {
public static int [][] matriz;

public Matriz (int x, int y) {..}
public Matriz (int [][] m) {..}
public int getValor(int x, int y) {..}
public void setValor(int x, int y, int d) {..}
public int[][] getMatriz() {..}
public int[] getColumna(int d) {..}
public int[] getFila(int d) {..}
public void verArray (int[] m) {..}
public void verMatriz() {..}

public Iterator iteradorFilasColumnas() {
return new IteradorFilas();
}

public Iterator iteradorColumnasFilas() {
return new IteradorColumnas();
}

@Override
public Iterator iterator() {
boolean bool = true;
if (bool) return iteradorFilasColumnas();
else return iteradorColumnasFilas();
}

}

Para poder recorrer la matriz he implementado dos iteradores, el primero recorre la matriz por fiilas y luego por columnas y el segundo recorre por columnas y luego por filas. Estos iteradores se crean en clases aparte que implementan el interfaz Iterator.

Os pongo uno, ya que los dos son muy parecidos.

import java.util.Iterator;

public class IteradorFilas implements Iterator {
public static int PosFila;
public static int PosCol;

public IteradorFilas() {
PosCol = 0;
PosFila = 0;
}

@Override
public boolean hasNext() {
return !((PosFila==Matriz.matriz[1].length) && (PosCol==Matriz.matriz.length));
}

@Override
public Object next() {
if (this.hasNext()) {
if (PosFila!=Matriz.matriz.length) // Si no es final de línea.
PosCol++;
else PosFila++;
return Matriz.matriz[PosFila][PosCol];
}
else return null;
}

@Override
public void remove(){
throw new UnsupportedOperationException("No soportado.");
}

}


La matriz debe crear dos métodos para realizar la iteración (iteradorFilasColumnas e iteradorColumnasFilas) que devuelvan los iteradores que hemos creado para que sean accesibles a otras clases. La matriz debe implementar el interfaz Iterable y lo quiero configurar mediante un booleano que diga cual de los dos iteradores se devolvería al llamar al método iterator().

Hasta aquí creo que todo me va bien, el problema es cuando quiero sumar dos matrices, que no me deja hacer nada con los iteradores, ya que no me los reconoce como enteros, si no como Objects, y tampoco me deja castearlos.

noviembre 17, 2015 | Registered Commentercharlie94

Intenta usar un Iterador Genérico, En tu clase fila en lugar de usar :

... Implements Iterator

usa

... implements Iterator<Integer>

Y en la clase Matriz en lugar de:

public static int [][] matriz;

usa

public static Integer[][] matriz;

Prueba a ver si con esos cambios podrías solucionarlo. Un saludo!

noviembre 19, 2015 | Registered Commenterloderain