[Solucionado] Redefinir método iterator

Iniciado por mavicadi, 4 Mayo 2013, 01:37 AM

0 Miembros y 1 Visitante están viendo este tema.

mavicadi

Hola a todos, estoy haciendo una práctica de estructura de datos en Java y me he quedado atascado a la hora de redefinir el método iterator.

La práctica consiste en desarrollar una clase que descienda de AbstractCollection<Integer>. Esa clase tiene que recibir dos enteros, que indican un rango de números enteros(Los enteros que reciben serán el mínimo y el máximo del rango) y a partir de los enteros se debe recorrer la colección desde el mínimo al máximo usando el iterator.

Hay alguien que me pueda ayudar ?!!

PD: No pido una solución, lo necesito un camino al que seguir.

Un saludo.

visualfree

Podrias comenzar mostrando tu avance estimado.

Saludos.

mavicadi

#2
Ok. Os explico, la clase hereda de AbstractCollection<Integer> y tiene un constructor que recibe dos números enteros, esos números son el máximo y el mínimo.


public class ColeccionRangoEnteros extends AbstractCollection<Integer> {

public int entero1;
public int entero2;

/*
*  COnstructor que recibe dos enteros.
*/
public ColeccionRangoEnteros(int num1, int num2) {
this.entero1 = num1;
this.entero2 = num2;

}



En la práctica también hay que redefinir size y lo he hecho de la siguiente manera, y me ha funcionado :

public int size() {
int tamano = 0;

if (this.entero1 < this.entero2) {
for (int i = this.entero1; i <= this.entero2; i++)
++tamano;
} else {
if (this.entero2 < this.entero1) {
for (int i = this.entero2; i <= this.entero1; i++)
++tamano;
}
}

return tamano;
}


Mi problema viene a continuación, cuando debo redefinir Iterator.

@Override
public Iterator<Integer> iterator() {

//TODO
return null;
}


Para realizar las comprobaciones el profesor nos deja una clase que se encarga de ello. Os pongo aquí una parte del código que hace las comprobaciones.

public static void compruebaColeccionRangoEnteros( int n ) {
Collection<Integer> c1 = new ColeccionRangoEnteros(0, n);
assert !c1.contains(-1);
assert c1.contains(0);
assert c1.contains(n);
assert !c1.contains(n+1);
}


Bueno, siento si el mensaje ha sido largo y sería de gran ayuda si además encontráis algo que no está debidamente programado.

Un saludo.


nicolas_cof

#4
Quizas te sirva...

Código (java) [Seleccionar]
package ar.com.nicolascof;

import java.util.AbstractCollection;
import java.util.Collection;
import java.util.Iterator;

public class Main {
public static void main(String[] args) {
check(5);
}

private static void check(int n) {
Collection<Integer> c1 = new ColeccionRangoEnteros(0, n);
assert !c1.contains(-1);
assert c1.contains(0);
assert c1.contains(n);
assert !c1.contains(n + 1);
}
}

class ColeccionRangoEnteros extends AbstractCollection<Integer> {

private Integer[] integers;

public ColeccionRangoEnteros(int min, int max) {
if (min >= 0 && max >= 0 && min <= max) {
this.integers = new Integer[max + 1];
for (int i = 0; min <= max; ++i) {
integers[i] = min++;
}
}
}

@Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
private int posicion = 0;

@Override
public boolean hasNext() {
return posicion < integers.length;
}

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

@Override
public void remove() {
throw new UnsupportedOperationException();
}

};
}

@Override
public int size() {
return integers.length;
}
}


Salu2

mavicadi

Muchísimas gracias nicolas_cof, ahora mismo me pondré con ello.

Solo para aclarar, que se me ha olvidado a la hora de poner el mensaje. En la práctica no es necesario guardar los valores intermedios de la colección (para eso usas el array integers verdad? ), simplemente te dan el máximo y el mínimo y la colección será todos los valores que estén en ese rango ( incluidos ellos ).

Muchas gracias otra vez por ayudar!!

mavicadi

Edito el asunto para ponerlo como solucionado. Me ha funcionado bien.
Gracias!