Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Lorenzo31 en 07 de Mayo 2015, 17:05

Título: diferencias entre Iterable e Iterator en Java orden natural y total CU00916C
Publicado por: Lorenzo31 en 07 de Mayo 2015, 17:05
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  (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.
Título: Re:CU00916C Interface Iterator api java.
Publicado por: Ogramar 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
Título: Re:CU00916C Interface Iterator api java.
Publicado por: Lorenzo31 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".
Título: Re:CU00916C Interface Iterator api java.
Publicado por: Ogramar 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.
Título: Re:CU00916C Interface Iterator api java.
Publicado por: Lorenzo31 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 :) ;)