Autor Tema: diferencias entre Iterable e Iterator en Java orden natural y total CU00916C  (Leído 6467 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas tardes a todos :) , quiero dejar mi ejercicio modificado para hacer una pregunta, porque en este caso se usa la interface Iterator pero no la Iterable, como en el ejercicio 912?? dejo link del 912.

https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=589:interface-iterable-y-metodo-iterator-api-java-recorrer-colecciones-ejercicio-y-ejemplo-resuelto-cu00912c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180

La razón puede ser que en ese ejemplo se usaba como campo de clase donde agregar Personas un  array[] y no ArrayList y por lo tanto ArrayList ya implementa Iterable ?

Perdonad la pregunta (tengo un poco de lio) pero intento asimilar los conceptos poniendolo en practica, aclarar que hice mi ejercicio antes de leer el ejercicio resuelto, aunque el remove() me costó, ahora lo entiendo.

Gracias de antemano como siempre por el tiempo y las molestias.
« Última modificación: 08 de Mayo 2015, 08:37 por César Krall »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:CU00916C Interface Iterator api java.
« Respuesta #1 en: 07 de Mayo 2015, 17:38 »
Hola! Iterable indica que se trata de una colección o serie sobre la que se puede iterar. Obliga a disponer de un método que permita crear un objeto de tipo Iterator que permita recorrer la colección.

Un Iterator es el objeto que permite recorrer la colección y que proporciona los métodos hasNext() y next()

Un Iterable sería lo que permite producir un Iterator, y un Iterator lo que permite recorrer una colección.



En el caso del ejemplo del curso creo que hubiera sido más correcto escribir

public class ListaPersonas implements Iterable

para dejar indicado que se implementa la interface Iterable (al introducir el método iterator que devuelve un objeto de tipo Iterator).


Pero quizás se dejó así porque la explicación se centraba en Iterator.

Ten en cuenta que en este ejemplo el resultado es igual de una forma que de otra. ¿Entonces para qué implementar Iterable? Para seguir el convenio de la programación Java. Esto es recomendado, pero nadie te obliga, podrías crear código saltándote todas las normas y convenciones, que mientras funcione... quien no entienda no se dará cuenta.

Salu2

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:CU00916C Interface Iterator api java.
« Respuesta #2 en: 07 de Mayo 2015, 18:41 »
Vale mil gracias Ogramar, entonces lo adaptaré a lo que indicas. Muy amable, es más para indicar que es Iterable y lo vamos a iterar que otra cosa OK lo haré, ( de hecho se sobreescribe el metodo iterator() en este caso. Mil gracias por tu tiempo como siempre.

Adjunto el ejercicio con implements Iterable<Persona> y en la clase Persona implemento Comparable<Persona> y ordeno con Collections.sort (por si a alguien le es util alguna vez) teniendo en cuenta la ID menor primera, creo que es considerado un "orden natural" aunque no he sabido encontrar a que se refiere con natural si Strings solo y el resto son Comparator "orden total".
« Última modificación: 07 de Mayo 2015, 18:48 por Lorenzo31 »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:CU00916C Interface Iterator api java.
« Respuesta #3 en: 07 de Mayo 2015, 21:33 »
Buenas, orden natural y orden total supongo que tienen una definición más precisa, pero se suele decir que el orden definido por el método compareTo de una clase que implementa la interface Comparable define un orden natural.

En CU00915C indica (https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=599:interface-comparator-api-java-diferencia-con-comparable-clase-collections-codigo-ejemplo-cu00915c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180):

Citar
Observamos también que queremos que esta clase sea ordenada naturalmente como ya hemos visto anteriormente al implementar Comparable. En este caso la ordenación se basa en el campo nombre de las Personas como queda reflejado en el método compareTo. Es decir, cuando se trate de realizar una ordenación “natural”, esta se hará por orden alfabético de nombres.

Las colecciones de Persona se ordenarán por este método siempre que se invoque una forma de ordenación que use la ordenación natural.

 Donde vemos cómo efectivamente la lista de Personas ha sido ordenada usando la invocación Collections.sort pasando como parámetro la colección y el orden utilizado en esta invocación es el orden natural definido en su clase, es decir, por el nombre de cada Persona. En este caso: Carla, María y Yovana de acuerdo al orden alfabético C, M, Y.

La clase Collections que hemos utilizado es una clase similar a la clase Arrays del api de Java. Puede ser invocada simplemente importándola y nos aporta distintos métodos estáticos, siendo únicamente necesario pasarle determinados parámetros para obtener un resultado.

Ahora bien, imaginemos que queremos ordenar a las Personas por un orden distinto a lo que hemos denominado orden natural, en este caso hablaremos de orden total. Como orden total podríamos elegir su fecha de nacimiento o en este caso por ejemplo usaremos la altura.

Entonces tenemos que hacer uso de la interfaz Comparator de la siguiente manera...
Creo que releyendo eso se aclara un poco.

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:CU00916C Interface Iterator api java.
« Respuesta #4 en: 07 de Mayo 2015, 21:49 »
Si Ogramar ya lo leí pero dudaba si solo era Nombre lo natural, buscando un poco orden natural, se refiere a ordenes lógicos, un Identificador de menor a mayor... nombres alfabeticamente.... etc.

Orden Total se refiere a ordenar por campos no tan comunes, sueldos, altura etc...

Y si en Comparable se ordena la forma natural con compareTo() y si quieres algun otro orden especial, creas un Comparator a proposito con compare().

Gracias, me queda todo más claro, una cosa que he visto, es que puedes aplicar los dos criterios uno detrás del otro, de forma que ordenes por dos campos, ejemplo de mas bajo a más alto, y ademas en igualdad, de identidad menor a mayor.

Gracias por tu tiempo, el tema me queda mucho mas claro, disculpa el tiempo empleado soy algo duro de moyera :) ;)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".