Java - Hacer clase IteradorPrimos a partir de un TEST

 
Vista:
Imágen de perfil de Juan José
Val: 54
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Hacer clase IteradorPrimos a partir de un TEST

Publicado por Juan José (20 intervenciones) el 03/03/2019 16:25:22
Buenas, necesito saber por què el método next() me devuelve números que no son primos.
El fallo lo encuentro en public void testNext().
Una ayuda por favor
La cosa es que sí me devuelve el primero, pero en el segundo me devuelve un 4 en lugar del 5.
Aqui la CLASE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package org.mp.sesion02;
 
import java.util.ArrayList;
import java.util.Iterator;
 
public class IteradorPrimos<E> implements Iterator<Integer> {
 
	private int limite = 0;
	private int actual = 2;
	ArrayList<String> numerosPrimos = new ArrayList<String>();
 
	public IteradorPrimos(int limite) {
		this.limite = limite;
	}
 
	public int getLimite() {
		return limite;
	}
 
	public int getActual() {
		return actual;
	}
 
	public static boolean esPrimo(int numero) {
		boolean primoActual = true;
		if (numero < 2) {
			primoActual = false;
		} else {
			for (int x = 2; x * x <= numero; x++) {
				if (numero % x == 0) {
					primoActual = false;
					break;
				}
			}
		}
		return primoActual;
	}
 
	// Interfaz Iterator
	@Override
	public Integer next() {
		int numero = this.actual++;
		if (numero <= this.limite) {
			return numero;
		} else {
			throw new UnsupportedOperationException("Método no soportado");
		}
 
	}
 
	@Override
	public boolean hasNext() {
		int numero = this.actual++;
		if (numero >= this.limite)
			return false;
		else
			return true;
	}
 
	public String mostrarPrimos() {
		String cadena = "";
		int contador = 0;
		for (int i = 2; i <= this.limite; i++) {
			if (esPrimo(i)) {
				cadena += "\t" + i;
				contador++;
			}
			if (contador >= 10) {
				contador = 0;
				cadena += "\n";
			}
		}
		return cadena;
	}
 
	@Override
	public void remove() {
		throw new UnsupportedOperationException("Método no soportado");
	}
 
}

Aqui el TEST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package org.mp.sesion02;
 
import static org.junit.Assert.*;
 
import java.util.Iterator;
import java.util.NoSuchElementException;
 
import org.junit.Before;
import org.junit.Test;
 
 
public class TestIteradorPrimos{
 
	private Iterator<Integer> iteradorPrimos;
 
	@Before
	public void setUp() throws Exception {
	}
 
	@Test
	public void testPropiedades() {
 
		iteradorPrimos = new IteradorPrimos(10);
		assertEquals(10, ((IteradorPrimos)iteradorPrimos).getLimite());
		assertEquals(2, ((IteradorPrimos) iteradorPrimos).getActual());
 
	}
 
 
 
	@Test
	public void testEsPrimo() {
		assertEquals(true,IteradorPrimos.esPrimo(2));
		assertEquals(true,IteradorPrimos.esPrimo(5));
		assertEquals(false,IteradorPrimos.esPrimo(9));
		assertEquals(false,IteradorPrimos.esPrimo(4));
 
	}
 
	@Test
	public void testNext() {
 
		iteradorPrimos = new IteradorPrimos(10);
		Integer actual = iteradorPrimos.next();
		assertEquals(new Integer(2), actual);
		assertEquals(new Integer(3), iteradorPrimos.next());
		assertEquals(new Integer(5), iteradorPrimos.next());
		assertEquals(new Integer(7), iteradorPrimos.next());
		try {
			assertEquals(new Integer(11), iteradorPrimos.next());
			fail("Debería haber lanzado una excepción");
		} catch (NoSuchElementException e) {
			assertEquals(e.getMessage(), "No se puede acceder a más números primos");
		}
 
	}
 
	@Test
	public void testHasNext() {
		iteradorPrimos = new IteradorPrimos(10);
		for (int i = 1; i <= 4; i++) {
			assertEquals(true, iteradorPrimos.hasNext());
			iteradorPrimos.next();
		}
		assertEquals(false,iteradorPrimos.hasNext());
	}
 
	@Test
	public void testRemove() {
		iteradorPrimos = new IteradorPrimos(10);
 
		try {
			iteradorPrimos.remove();
			fail("Debería haber lanzado una excepción");
		} catch (UnsupportedOperationException e) {
			assertEquals(e.getMessage(), "Método no soportado");
 
		}
 
	}
 
	@Test
	public void testMostrarPrimos() {
		String cadenaGenerada, cadena;
 
		iteradorPrimos = new IteradorPrimos(1);
		cadenaGenerada =  ((IteradorPrimos) iteradorPrimos).mostrarPrimos();
		cadena = "";
		assertEquals(cadenaGenerada, cadena);
 
		iteradorPrimos = new IteradorPrimos(10);
		cadenaGenerada = ((IteradorPrimos) iteradorPrimos).mostrarPrimos();
		cadena = "\t" + 2 + "\t" + 3 + "\t" + 5 + "\t" + 7;
		assertEquals(cadenaGenerada, cadena);
 
 
		iteradorPrimos = new IteradorPrimos(17);
		cadenaGenerada = ((IteradorPrimos) iteradorPrimos).mostrarPrimos();
		cadena = "\t" + 2 + "\t" + 3 + "\t" + 5 + "\t" + 7 + "\t" + +11 + "\t" + 13 + "\t" + 17;
		assertEquals(cadenaGenerada, cadena);
 
		iteradorPrimos = new IteradorPrimos(20);
		cadenaGenerada = ((IteradorPrimos) iteradorPrimos).mostrarPrimos();
		cadena = "\t" + 2 + "\t" + 3 + "\t" + 5 + "\t" + 7 + "\t" + +11 + "\t" + 13 + "\t" + 17 + "\t" + 19;
		assertEquals(cadenaGenerada, cadena);
 
		iteradorPrimos = new IteradorPrimos(70);
		cadenaGenerada = ((IteradorPrimos) iteradorPrimos).mostrarPrimos();
		cadena = "\t" + 2 + "\t" + 3 + "\t" + 5 + "\t" + 7 + "\t" + 11 + "\t" + 13 + "\t" + 17 + "\t" + 19 + "\t" + 23
				+ "\t" + 29 + "\n" + "\t" + 31 + "\t" + 37 + "\t" + 41 + "\t" + 43 + "\t" + 47 + "\t" + 53 + "\t" + 59
				+ "\t" + 61 + "\t" + 67;
		assertEquals(cadenaGenerada, cadena);
 
	}
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Hacer clase IteradorPrimos a partir de un TEST

Publicado por Billy Joel (875 intervenciones) el 07/03/2019 16:13:53
Estuve viendo este post el fin de semana y se me ha pasado contestar, disculpas...
Veo que has utilizado un JUnit para realizar test de pruebas. No estoy muy familiarizado con eso pero... cuando ejecuté tu código me pregunté ¿qué clase de brujería es esa?.

Por lo que puedo ver el uso que le darás a la clase IteradorPrimos es iterar los elementos de un conjunto de números que puede ser del 1 hasta el límite o los elementos de un arreglo...

Entonces en el constructor deberías llenar tu arreglo de números primos y luego recorrerlo.
Lo hice de nuevo más sexy simple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class IteradorPrimos2<E> implements Iterator<Integer> {
 
    int index;
    int[] primos;
 
    public IteradorPrimos2(int numero) {
        String s = "";
        for (int i = 2; i <= numero; i++) {
            if (isPrimo(i)) {
                s += i + ",";
            }
        }
        String[] a = s.substring(0, s.length() - 1).split(",");
        primos = new int[a.length];
        for (int i = 0; i < a.length; i++) {
            primos[i] = Integer.parseInt(a[i]);
        }
    }
 
    public IteradorPrimos2(int [] arreglo){
        String s = "";
        for(int i : arreglo){
            if(isPrimo(i)){
                s += i + ",";
            }
        }
        String[] a = s.substring(0, s.length() - 1).split(",");
        primos = new int[a.length];
        for (int i = 0; i < a.length; i++) {
            primos[i] = Integer.parseInt(a[i]);
        }
    }
 
    public boolean isPrimo(int n) {
        if (n == 1) {
            return false;
        }
        for (int i = 2; i < n; i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
 
    @Override
    public boolean hasNext() {
        return index + 1 <= primos.length;
    }
 
    @Override
    public Integer next() {
        return primos[index++];
    }
}

Lo puedes implementar así:
1
2
3
4
IteradorPrimos2 p = new IteradorPrimos2(100);
while (p.hasNext()) {
    System.out.println(p.next());
}

O tal ves así
1
2
3
4
5
int [] arreglo = new int [] {16,24,33,24,25,16,67,548,49,10,11,12,13,14,15,16};
IteradorPrimos2 p = new IteradorPrimos2(arreglo);
while (p.hasNext()) {
    System.out.println(p.next());
}

Algo me dice que este no va a fallar al aplicarle el test.

Saludos!!
;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar