Java - Array length rebelde

 
Vista:
Imágen de perfil de Victor

Array length rebelde

Publicado por Victor (11 intervenciones) el 22/07/2015 10:48:03
Relacionado con una duda anterior. En la linea 74 del código no me admite el valor length de un array dándome un error ArrayIndexOutOfBoundsException, tras hacer un sort del mismo

No entiendo por qué ocurre esto. Si la longitud del array es 7 , ¿por qué no me puede dar el valor de la posición 7? En el código le he puesto -1 para que no dé error, pero no es lógico, imagino.

Gracias

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 primos;
 
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Scanner;
 
/**
 *  Crea un array de números de un tamaño pasado por teclado, el array contendrá
 *  números aleatorios primos entre los números deseados, por último nos indicará
 *  cual es el mayor de todos.
    Haz un método para comprobar que el número aleatorio es primo, puedes hacer
    todos lo métodos que necesites.
 
 */
public class Primos {
 
    private static Scanner  teclado = new Scanner(System.in);
    static int              cantidad;
    static int              acalcular;
    static int              ntop;
    static int              ndown;
    static String           a;
    static boolean          control=false;
    static int              primogenerado;
    static int              elmasalto=0;
 
 
    /* Entrada de números y cálculo
       de los números primos resultantes
    */
 
    public static void main(String[] args) {
 
        // Solicitar cantidad de números a generar
        while (!control) {
            System.out.println("Introduzca la cantidad de números primos a generar:");
            a = teclado.next();
            if (chequea() == true) {
                acalcular=cantidad;
            }
        }
        control=false;
 
 
        // Solicitar número más bajo
         while (!control) {
            System.out.println("¿A partir de qué numero se generarán los números primos?");
            a = teclado.next();
            if (chequea() == true) {
                ndown=cantidad;
            }
         }
         control=false;
 
 
         // Solicitar número más alto
         while (!control) {
            System.out.println("¿Hasta qué numero se generarán los números primos?");
            a = teclado.next();
            if (chequea() == true) {
                ntop=cantidad;
            }
         }
 
         // Presento los números primos generados y los incluyo en un array en el rango indicado.
         int primos [] = new int [acalcular-1];
         System.out.println("\n\n Los números primos generados son:");
         for (int i=0 ; i<primos.length ; i++){
             primos [i]=generaprimo();
             System.out.println(generaprimo());
         }
         Arrays.sort(primos);
         int fin=primos.length;
         System.out.println("\n \n El número primo más alto generado es el "+primos[primos.length-1]);
 
 
        //System.out.println("El número primo más alto generado es el "+primos[finarray]);
 
         }
 
 
 
 
 
 
 
        /*
         *    
         *   MÉTODOS
         *
        */
 
        // Método que chequea que la entrada de datos es numérica
 
        static boolean chequea() {
          try {
              cantidad = Integer.parseInt(a); // aqui convierto de string a int, en caso de que no sea un numero medara el error que incluyo en catch
             return control=true;
         } catch (NumberFormatException e) {
             System.err.println("Error en la entrada de datos. Introduzca un valor correcto.");
               return control=false;
          }
        }
 
 
        // Método que genera los números primos.
        public static int generaprimo(){
            control=false;
            while(!control){
            primogenerado=(int)Math.floor(Math.random()*(ndown-ntop)+ntop);
            if (((primogenerado==2)|(primogenerado==3)|(primogenerado==5)|(primogenerado%2>0)&&(primogenerado%3>0)&&(primogenerado%5>0)&&(primogenerado%7>0))&(!(primogenerado==1)))
            control=true;
            }
            return primogenerado;
            }
        }
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
sin imagen de perfil

Array length rebelde

Publicado por Rafael (9 intervenciones) el 22/07/2015 10:58:35
Los arrays empiezan con el valor 0...

De tal modo que si el array tiene una longitud de 7 sus indices son 0, 1, 2, 3, 4, 5, 6... si le pides el 7 esta fuera de magnitud.

Tu mismo previo al sort haces esto.. en tu codigo empiezas a iterar en 0 mientras que el indice sea menor que el largo...
1
2
3
4
for (int i=0 ; i<primos.length ; i++){
             primos [i]=generaprimo();
             System.out.println(generaprimo());
         }

Asi pues si es lógico no crees???

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Victor

Array length rebelde

Publicado por Victor (11 intervenciones) el 22/07/2015 11:35:19
Sí, lo de decir que no es lógico no me ha quedado muy bien, porque siempre es error del operador :)

Entonces es un error de concepto, length no me devuelve el valor contando desde cero. Di por sentado eso, también. OK, gracias
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