Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Beginner Web en 25 Abril 2019, 05:40 am



Título: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: Beginner Web en 25 Abril 2019, 05:40 am
Hola tengo un arreglo de 10 posiciones donde solo coloque valores en las 4 primeras y quiero recorrer el arreglo pero sin leer los valores por defecto que son los 0, como hago o no se puede?

Código
  1. int arreglo[] = new int[10];
  2.  
  3.        arreglo[0] = 1;
  4.        arreglo[1] = 2;
  5.        arreglo[2] = 3;
  6.        arreglo[3] = 4;
  7.  
  8.        for (int i = 0; i < arreglo.length; i++) {
  9.            System.out.print(arreglo[i]);
  10.        }


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: rub'n en 25 Abril 2019, 09:24 am
Hola tengo un arreglo de 10 posiciones donde solo coloque valores en las 4 primeras y quiero recorrer el arreglo pero sin leer los valores por defecto que son los 0, como hago o no se puede?

Código
  1. int arreglo[] = new int[10];
  2.  
  3.        arreglo[0] = 1;
  4.        arreglo[1] = 2;
  5.        arreglo[2] = 3;
  6.        arreglo[3] = 4;
  7.  
  8.        for (int i = 0; i < arreglo.length; i++) {
  9.            System.out.print(arreglo[i]);
  10.        }

No entendí muy bien, quieres recorrer las posiciones menos la posición cero, o no imprimir los valores que sean iguales a cero? , O sea, filtrar?


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: Beginner Web en 25 Abril 2019, 15:42 pm
Si, solo quiero leer las posiciones donde ingrese valores, las otras no  ;-)


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: rub'n en 25 Abril 2019, 15:50 pm
Si, solo quiero leer las posiciones donde ingrese valores, las otras no  ;-)

Código
  1. for(int f=0; f<4; f++)

No tengas miedo a probar Chavalina  :D, desde 0 para incluir ese Index, y hasta menos 4 para no incluir la posición 5


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: WHK en 25 Abril 2019, 16:36 pm
En ese caso no sería mejor utilizar un objeto de tipo List<> en ves de un array nativo?, de esa manera puedes tener objetos nulos, donde el valor por defecto sea nulo y dentro del for dices que si el valor no es nulo entonces se procesará, de esa manera no dependerás de la cantidad de valores que llenes, esto funciona solo si usas los objetos de Java en ves de los primitivos, por ejemplo List<Integer> list; , incluso puedes utilizar lambda.

Saludos.


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: Beginner Web en 25 Abril 2019, 18:51 pm
Claro, ahí si funcionaría  :laugh:
¿Así, verdad?

Código
  1. ArrayList<Integer> arreglo = new ArrayList<>();
  2.        arreglo.add(1);
  3.        arreglo.add(2);
  4.        arreglo.add(3);
  5.  
  6.        for (int i : arreglo) {
  7.            if (Objects.nonNull(i)) {
  8.                System.out.println(i);
  9.            }
  10.        }

¿Por qué no funciona si coloco en el ArrayList<int> en lugar de ArrayList<Integer>???

Ya veo que no funcionará con el arreglo simple :xD


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: rub'n en 25 Abril 2019, 19:09 pm
Claro, ahí si funcionaría  :laugh:
¿Así, verdad?
¿Por qué no funciona si coloco en el
Código
  1. ArrayList<int> en lugar de ArrayList<Integer>
 ???

Código
  1. ArrayList<Integer> arreglo = new ArrayList<>();
  2.        arreglo.add(1);
  3.        arreglo.add(2);
  4.        arreglo.add(3);
  5.  
  6.        for (int i : arreglo) {
  7.            if (Objects.nonNull(i)) {
  8.                System.out.println(i);
  9.            }
  10.        }

Y con lo del arreglo comun, ya veo que no funcionará  :xD

Lee un poco más detallado el mensaje de WHK , mejor dicho el gran WHK, porque las listas genéricas funcionan únicamente con Objetos,. El objeto que representa al primitivo int, es Interger, o sea, la clase envoltoria(wrapper) es Integer.

Ese for que usas en la línea 6 carece de índice, se llama for extendido

Usa el for normal que si tiene índice.

Código
  1. for(int f=0; f<arreglo.size(); f++)

Edito, ambos for sirven, pero cada uno para una cosa, todo depende lo que quieras hacer,

Con el arreglo normal puedes usar el for normal, Stream, IntStream, Arrays.stream

Recuerda también que las clases van en mayúsculas, o sea, Double, Integer, Boolean, Long etc... Nomenclatura camel case



Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: Beginner Web en 25 Abril 2019, 19:32 pm
Haaaaaaaaaaa!!!

Código
  1. ArrayList<Integer> lista = new ArrayList<>();
  2.        lista.add(1);
  3.        lista.add(2);
  4.        lista.add(3);
  5.  
  6.        for (int i=0; i<lista.size(); i++) {
  7.            if (Objects.nonNull(i)) {
  8.                System.out.println(i);
  9.            }
  10.        }


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: rub'n en 25 Abril 2019, 19:34 pm
Tú me recuerdas tanto a las primillas mias  :xD


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: WHK en 26 Abril 2019, 04:50 am
Con lamda no necesitas iteraciones:

Código:
lista.stream().filter(Objects::nonNull).reduce((k, v) -> v);

Esto retorna todos los valores no nulos, incluso puedes aplicar funciones de llamada syncrónica dentro de lambda para procesar cada valor sin iteraciones.

Claramente internamente la JVM realiza iteraciones, pero se hace a bajo nivel, el performance es mucho mejor.

De todas maneras por mas que lo pienso no encuentro sentido alguno tener un listado vacio de items y menos aun cuando la pila se vuelve muy grande.

Saludos.


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: W0lFy en 26 Abril 2019, 15:17 pm
Si quieres utilizar arrays... yo haría esta solución... :)

Código:
 int arreglo[] = new int[10];
        arreglo[0] = 5;
        arreglo[1] = 5;
        arreglo[2] = 5;
        arreglo[3] = 5;
        for (int i = 0; i < arreglo.length; i++) {
            if (arreglo[i] == null)
                break;
            System.out.println(String.valueOf(arreglo));
        }


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: WHK en 27 Abril 2019, 04:16 am
Y si el valor nulo está en el primer item?, le hará un break al for sin poder obtener los valores no nulos.


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: W0lFy en 29 Abril 2019, 09:19 am
Cierto... colleja ;), aunque te parezca mentira mi profesión es programador ^^
Código:
int arreglo[] = new int[10];
        arreglo[0] = 5;
        arreglo[1] = 5;
        arreglo[2] = 5;
        arreglo[3] = 5;
        for (int i = 0; i < arreglo.length; i++) {
            if (arreglo[i] != null)
                System.out.println(String.valueOf(arreglo));
        }


Título: Re: Leer un arreglo sin tomar en cuenta sus valores por defecto
Publicado por: WHK en 30 Abril 2019, 03:46 am
Cuando trabajas con objetos primitivos no puedes establecerlo como nulo:

Código:
int arreglo[] = new int[10];

Cuando creas un array nativo de int todos los valores por defecto son 0, en cambio en un List<Integer> puedes tener valores nulos.

Ningún valor del array puede ser nulo porque no puedes cambiar el tipo, eso se llama ser "mutable", un objeto de java puede tener varios tipos, por ejemplo un "Integer" puede ser objeto de tipo int y null al mismo tiempo (por eso existen las anotaciones @Nullable y @NotNull), en cambio el primitivo no puede ser nulo o dará excepción, en Java da excepción de tipo y en c++ excepción de memoria a menos que lo establezcas a \0, pero no se recomienda para un tipo int.