UTNianos

Versión completa: [Paradigmas de Programación] Objetos - Pharo
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas!
Desde hace un rato que estoy luchando con el Pharo, y por ahora me gana lejos!!
Estoy haciendo un metodo que cuenta la cantidad de objetos de una coleccion. Lo de estoy haciendo es bastante generoso porque no me sale un cuerno!
Se entiende mas o menos lo que quiero?
Hay una coleccion (es un diccionario) de objetos que tienen un atributo que es "dueño".
Los jugadores son los "dueños" de los objetos, por lo que dentro del diccionario hay objetos que le pertenecen a pepe, otros a pipa, etc.
En la clase jugadores cree el sig metodo, que esta mal!

contarInversiones
(coleccion select:[ :a | a dueño: self ])size.

Alguna idea???
Gracias!!!

F.
Para empezar una coleción y un diccionario no son exactamente la misma cosa.

En un diccionario vos tenés relaciones del tipo "clave -> valor", donde la clave es un objeto, y el valor otro (cualquier objeto).
Así que no podés tener un diccionario con un atributo "dueño".

Ahora, lo que entiendo de tu planteo, es que tenés una colección (supongo que una OrderedCollection) con objetos, que tienen un atributo (variable de instancia) dueño.
Pensá cómo lo harías a mano, si tus objetos fueran por ejemplo tarjetas con un dueño. Suponete que tus objetos son los naipes y querés saber cuántos naipes de cada palo tenés; digamos que el palo sería el "dueño". Entonces vos irías sacando cartas del mazo, y acomodándolas en montones según el palo. ¿Se entiende?

Supongamos que no sabemos cuántos dueños existen, entonces no sabemos cuántos montones hay que hacer. En tu caso, cada montón sería una nueva colección.

Hay muchas formas de hacerlo, pero una sencilla es la siguiente:

Supongo que una OrderedCollection en Pharo entiendo el mensaje groupBy: entonces deberías hacer:



| coleccionDeObjetos objetosAgrupados |

coleccionDeObjetos := "acá supongo que ya tenés la colección de alguna forma".

objetosAgrupados := coleccionDeObjetos groupBy: [:unObjeto | unObjeto duenio].




Con eso obtenés tus colección de objetos agrupados por dueño, y el resultado (objetosAgrupados) es un diccionario, donde la clave es el dueño y el valor una OrderedCollection con los objetos que le pertenecen.

Luego, para ver los resultados, podés usar algo como:



objetosAgrupados keysAndValuesDo: [:dueño :objs |
Transcript
show: dueño printString;
cr;
show: objs size printString;
cr; cr;
]




Imagino que Dictionary en Pharo entiende el mensaje keysAndValuesDo: así que no debería haber problema.

Cualquier cosa volvé a preguntar.
estoy viendo pharo. el mensaje para agrupar objetos de una colección no es groupBy: sino groupedBy:

ejemplo:

(OrderedCollection new)
add: 'aas';
add: 'sfdf';
add: 'fdfd';
yourself ;
groupedBy: [:x | x first ]



y el mensaje keysAndValuesDo: sí existe así que no hay problema ahí.

el Transcript lo tenés que abrir mandando el mensaje open.
ejemplo:



Transcript open.
((OrderedCollection new)
add: 'aas';
add: 'sfdf';
add: 'fdfd';
yourself ;
groupedBy: [:x | x first ])
keysAndValuesDo: [:clave :valor | Transcript show: clave printString; cr; show: valor printString; cr]



Antes que nada, gracias Lea!!
No me aviso de la respuesta y la veo recien ahora!
No estaba mal mi razonamiento, lo que pasa es que en vez de ":" va un "=", bien de salame el error!
Pero despues pusiste algo que me interesa, como hago para que me muestre los objetos de una coleccion?
Y ya que estamos, tengo:
juan:= Jugador new.
Si meto a juan en una coleccion (bag) y la muestro me pone a Bag (a Jugador), o algo asi. Necesitaria que me devuelva Juan, sabes como se hace?
Podria crearle una variable a jugador que diga nombre, pero no me parece lo optimo.
Saludos y gracias de nuevo.
F.
lea, el tema es que el groupBy no se usa en PdeP ni en pedo...


arriesgándome a caer en subestimaciones y bla, se me ocurre que lo que necesitabas hacer era contar las inversiones de una persona conociendo la colección de todas las inversiones existentes... entonces, por eso con un inversiones select: [:inversion | inversion dueño = self] estabas más que hecho...


para la pregunta esta nueva, te la desgloso en dos partes...

lo que preguntás puntualmente lo podrías llegar a hacer redefiniendo alguno de los métodos "printOn:" o alguno similar (en Dolphin creo que eran printStream, pero acá sinceramente no lo se)

aún así, te pregunto... ¿estás seguro que necesitás eso? porque pensá que cuando al pedir "Print it" te muestra "a Bag (a Jugador)", lo que estás mostrando no es el nombre de un jugador ni un jugador, sino una colección de jugadores.

Si por algún motivo (para hacer algo) necesitás el nombre de un jugador, pensá que son tres objetos distintos: la colección, el jugador, y su nombre. Entonces, si quisieras tener el nombre "Juan" para hacer algo con ello, a la colección le pedís el jugador (en este caso podría ser jugadores first), y a eso le pedís su nombre (osea, jugadores first nombre)..



ahhhhhh! ahí caí en otra cosa...

cuando vos hacés "juan := Jugador new", a una variable que VOS llamás "juan" le asignás un objeto Jugador. ahora, el objeto Jugador NO TIENE NI IDEA de que existe una variable "juan" que lo referencia, ni tiene sentido que eso pase. Como habrás visto en clase (con pepita, seguramente), al mismo objeto instancia de Jugador referenciado por "juan" lo podés referenciar con otras variables, como, por ejemplo, "jugador", "primo", o cualquier nombre pedorro... incluso podría haber una variable "ernesto" referenciandolo...

lo importante es que tu objeto NO SE ENTERA de quiénes lo apuntan, ni tiene por qué importarle...

pensá que los objetos son abstracciones de la realidad, y, si en la realidad los Jugadores tienen un atributo "nombre", tiene TODO EL SENTIDO que tu clase Jugador tenga una variable de instancia llamada "nombre". Y, ahí, por más que un objeto Jugador con su variable de instancia "nombre" apuntando al string "Juan" sea referenciado por una variable llamada "jose", otra llamada "hermano" y otra llamada "aprendizDeEberLuduenia", el nombre de ESE jugador va a ser Juan.


moraleja: referencia != identidad/atributo/instancia/objeto...

(si tenés apuntes - tanto los de Spigariol del CEIT o los que cuelgan en la página los cursos de la mañana - repasate el capítulo sobre múltiples referencias a la misma instancia y esas cosas...)
Gracias Desert!
Estaba casi seguro que era asi como vos decias, pero queria estar seguro.
Hoy se lo consulte a Fleichman y me dijo que no se puede, tengo que agregarle un atributo que se llame nombre.
Para que lo queria? Por ejemplo para armar un ranking. Ordeno la coleccion y me tira (a Jugador a Jugador a Jugador a Jugador a Jugador) y es un pijazo!
Gracias por todo!!
Saludos!
F.
URLs de referencia