Curso Java. Volumen XI : Introducción a las listas (Arrays)

Escrito por Adrián Crespo
Java

Continuamos con el curso de Java en RedesZone.

En las dos anteriores entregas dimos la solución de los 4 ejercicios que os habíamos propuesto. En esta nueva entrega os adelanto que vamos a dar un paso más.

Vamos a hablaros de las listas en Java. Las listas en Java se pueden definir con Arrays, LinkedList, ArrayList.

Sin embargo, en el volumen de hoy y en los siguientes nos centraremos en los Arrays.  Así que vamos al tema.

Los arrays permiten guardar muchos datos del mismo tipo

  •  Se agrupan bajo un nombre común.
  •  Se utiliza un índice numérico para referirse al dato individual.
  •  En Java el índice se restringe: [0..N-1] ( por lo tanto se definimos un array de 5 elementos, nuestro índice estaría comprendido entre 0 y 4).
  •  O varios índices en el caso de arrays multidimensionales (por ejemplo las matrices).
  •  Los datos pueden ser variables o referencias a objetos.
  •  El tamaño es fijo: no puede cambiar.
  •  El array en Java se usa como un objeto.
  •  Se usa a través de una referencia.
  •  Se crea con la palabra reservada new.

Después de estas nociones breves de teoría general de Arrays, vamos a meternos ahora en la explicación de los Arrays unidimensionales

  •  Arrays Unidimensionales
  • Declaración:

tipo nombre[];

O también:

tipo[] nombre;

  • Para crear un objeto del tipo array

nombre=new tipo[tamaño];

Donde:

  •  El tipo es el tipo base de los elementos del array.
  •  Tipo elemental.
  •  O una clase (coche, ExamenConducirTeorico….).
  • El nombre representa una referencia a un objeto del tipo Array, que aún no existe ya que solo es una declaración.

 Ejemplos de creación de arrays

  • Declaración y creación:

float coord[];
coord = new float[3];

O todo junto:

float coord[] = new float[3];

O equivalentemente:

float[] coord = new float[3];

El array referenciado por coord tiene tres elementos con indices 0,1,2.

· al crear el array todos sus elementos se inicializan a cero

Nota sobre el rango del índice

Al crear un array por ejemplo int[] diasMes = new int[13]; , tenemos un array con 13 casillas, es decir, el índice de las casillas se moverá entre los valores 0 y 12. Cuando vayamos a recorrer todas sus posiciones deberemos tener cuidado con las condiciones de salida de los bucles for y while.

Después de todo lo mencionado anteriormente que mejor que verlo en un ejemplo:

  • Recorrer una tabla (lista) de enteros y calcular la media

Ejercicio voluntario

Basándose en el programa principal de lista de números y la media aritmética, hacer un programa ( o dos si lo queréis hacer separado), que busque el mayor número y el menor número de una lista.

Como ayuda, en cada interacción, el programa comparara si es el mayor o el menor hasta ese momento. Si se da uno de los dos casos (no se pueden dar los dos), modificaremos el mayor o menor que teníamos hasta ese momento.

Hasta aquí el volumen XI, la semana que viene seguiremos hablando de Arrays, en concreto de Arrays como parámetros en las funciones.


Continúa leyendo
  • melenas1414

    esto está mal ” tenemos un array con 12 casillas, es decir, el índice de las casillas se moverá entre los valores 0 y 12.” son 13 casillas, empieza en el 0 y termina en el 12

    • Si el array son 12 casillas va desde 0 a 11.

      • melenas1414

        pero cambiarlo xD, que si no hace un poquito de lío creo yo

        • FIXED!!

        • prueba este codigo y pinta los elementos, si es asi como quieres ponerlo,veras como da problemas, el primero se queda sin inicializar.

          public class Array
          {

          public static void main (String []args)
          {
          int [] elementos= new int[12];

          for ( int i=1; i<=elementos.length; i++)
          {
          elementos[i]=2;
          }

          }
          }

          en java los indices empiezan de 0 a hasta n-1 y en ADA por ejemplo empiezan en 1 hasta n, despende del lenguaje

          un saludo

  • Serpyd

    Buen aporte Adrian.
    Adrian, sería posible poner todos los temarios de Java en un pdf??
    Me gustaría volver a leerlos enteramente, ya que es bastante difícil.

    Gracias

    Serpyd (Luis)

    • Tenemos que hacer muy pronto un índice de todos los volúmenes y ponerlo en la web en la parte izquierda, esta noche lo hago 🙂 Así no tendrá pérdida.

      • Serpyd

        Sergio the big master.

      • por mi perfecto, asi ademas estara mas accesible y si se quieren buscar las cosas, estara mas a mano

        • Voy ahora mismo a ello y en el próximo artículo lo nombramos para los despistados.

  • Marcelo

    Que tal, esta muy bueno esto, gracias por la onda.
    Te hago una consulta. Hice una clase para el ejercicio propuesto y queria saber si esta bien asi el constructor, en cuanto a la asignacion de nums = numeros. Me funca, pero no se si es lo mejor esa igualacion.

    //Atributos
    private int nums[];
    //Constructor
    public MaxMin (int numeros[])
    {
    nums= numeros;
    }

    Saludos y gracias.
    Marcelo (Bs As)

    • la asiganacion es correcta, pero no es necesario tanto xD. Como un main y dentro del main una lista vale, de momento cosas tan complejas no necesitamos

      Sl2

  • Mirad en la parte izquierda de la web en la caja TUTORIALES, y pincháis en Curso Java.

    He separado las prácticas de la teoría para diferenciarlo mejor.

    ¿Os gusta o lo pondríais de otra forma? Vuestros deseos son órdenes 😀 Ya veis que somos muy dinámicos y hacemos las cosas rápidamente 😀

  • melenas1414

    no me sale me da error en el primer if:
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */

    package ejercicios;

    /**
    *
    * @author santi
    */
    public class arraysmayormenor {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
    // TODO code application logic here
    int nums[] = {3,4,7,8,4,5,6};
    int mayor, menor;
    for (int i=0; i<nums.length; i++)
    {
    if (nums[i] < nums[i+1])
    {
    menor=nums[i];
    }
    else
    {
    mayor=nums[i];
    }
    }
    for (int i=0; i<nums.length; i++)
    {
    if (nums[i]==mayor)
    {
    System.out.println("El mayor es "+nums[i] "y su posición es " +i);
    }
    if (nums[i]==menor)
    {
    System.out.println("El menor es "+nums[i] "y su posición es " +i);
    }
    }
    }
    este es el error:
    run:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
    at ejercicios.arraysmayormenor.main(arraysmayormenor.java:23)
    Java Result: 1
    BUILD SUCCESSFUL (total time: 0 seconds)

    • Es porque te sales del array, en el FOR pon esto:

      for (int i = 0; i < nums.length-1; i++) Porque en el IF tienes i+1, entonces intentas leer en una posición de memoria inexistente.

    • ahora entiendes porque se utilizan los indices de 0 a 11? Porque si piensas asi te evitas estos errores de excederte en la longitud de la lista. Si piensas en “normal” pues al final acaba te acabas liando y te salta la exepcion xD

      un saludo

      • melenas1414

        aaa ya entiendo, el problema es la función .length, yo es que lo que hago en otros formatos de programación es indicar el final, no que lo dicte el número xD
        Ya está xD, no sé si explicasteis la función .length, pero supongo que te dice el número empezando por el 1 por eso hay que restarle 1.

      • melenas1414

        por cierto en el ejemplo no está así.

        • En el ejemplo no se sale de array poniendo i+1 en el IF 😀

  • como parece que no ha quedado voy a tratar de explicarlo:

    Si tenemos una lista con n elementos, los indices de esa lista siempre iran de 0 a n-1. Luego tenemos el metodo length de los arrays que nos devuelve el numero de elemento (n) que contiene la lista, por lo que tenemos un problema, si hacemos esto:

    for (int i=0; i<=lista.length; i++)
    {
    …..
    }

    este codigo lanzara una excepcion porque length nos devuelve 12 ( en nuestro ejemplo), pero el ultimo indice es 11, por lo que diria ArrayIndexOutOfBoundsException

    ¿Solucion?

    Si, dos formas de implementarlo:

    for (int i=0; i<lista.length; i++)
    {
    …..
    }

    for (int i=0; i<=lista.length-1; i++)
    {
    …..
    }

    en los dos casos se recorren todos los elementos 12 elementos, del 0 al 11

    un saludo

  • Adrian

    Hola.

    Tengo una duda ¿por que unicamente me entra en el else if, para asignarle el 3 a la variable menor?, no lo entiendo.

    tengo el siguiente códgio:

    public class array {

    public static void main (String[] args){

    int nums[]= {1,3,5,7,2,9,0};
    int suma=0;
    double media;
    int mayor=5;
    int menor=5;

    for(int i=0;i mayor){

    mayor=nums[i];
    }

    else if ( nums[i] < menor){

    menor=nums[1];

    }

    System.out.println("el numero mayor es " +mayor + " en la " + i + "º vuelta");
    System.out.println("el numero menor es " +menor + " en la " + i + "º vuelta \n");

    }

    media = (double) suma / nums.length;
    System.out.println("La media es: " +media);
    System.out.println("La longitud del archivo es: "+ nums.length);

    }

    }

    Hay alguna forma de sumar un valor directamente el printf, por ejemplo si tengo esto:

    System.out.println("el numero mayor es:" +mayor + "en la " + i+1 + "º vuelta"); asi me concatena el valor de la variable i con el numero, pero lo que queria es sumarlo , para ahorrarme otra variable distinta

    Muchas gracias

  • Adrian

    Perdonar, no entiendo por que me salio un doble post, y el codigo que sale ahi esta incompleto:

    for ( int x = 0; x mayor){

    mayor=nums[x];
    }

    else if ( nums[x] < menor){

    menor=nums[1];

    }

    System.out.println("el numero mayor es " +mayor + " en la " + x + "º vuelta");
    System.out.println("el numero menor es " +menor + " en la " + x + "º vuelta \n");
    }

    • te miro ala noche haber que puede fallar, y te contesto

      • Adrian

        no te preocupes, de todas formas sigue estando incompleto debe ser cosas de los simbolos mayores y menores que los interpretara como tags el este y no sale el codigo completo:

        a partir del for en la igualacion del i o que seguiria es:

        i menorque nums.length;i++){

        suma=suma + nums[i];

        if (nums[i] > mayor){

        Si no sale completo este post, pors ya me las apaño, muchas gracias de todas formas

        • mándame los archivos .java al correo, y así no habrá problemas

        • si me envias los ficheros como te he comentado mejor, porque faltan cosas y asi es imposible corregirlo

  • rjonathan87

    /*
    increíble me salió a la primera y soy novatisimo
    */

    package arraymayormenordelista;

    public class Main {

    public static void main(String[] args) {
    int nums[] = {13,4,7,8,4,5,6};
    int mayor = nums[0];
    int menor = nums[0];

    System.out.println(mayor + ” ” + menor);

    for(int i =0; i mayor)
    mayor = nums[i];
    if(nums[i] < menor)
    menor = nums[i];
    }

    System.out.println("mayor es: " + mayor + " menor es: " + menor);

    }

    }
    /*
    Gracias por los tutos
    */