Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Nafko en 15 Abril 2015, 22:14 pm



Título: Array Bidimensional de objetos
Publicado por: Nafko en 15 Abril 2015, 22:14 pm
Hola...

Quisiera saber como puedo ingresar objetos a una matriz, y después imprimirlos es una lista pero eso es mas fácil por medio de un ciclo, lo que me complica es como crear la matriz para que guarde por ejemplo el nombre, rut, tipo sala de cine, y precio (String, String (por los puntos y el guion), String, Int) y todo eso por medio de métodos.

Desde ya muchas gracias :)


Título: Re: Array Bidimensional de objetos
Publicado por: Lind L. Tailor en 15 Abril 2015, 23:36 pm
Hola...

Por lo que entendí necesitas crear una simple lista de objetos, si ese es el caso puedo ayudarte con un código sencillo pero útil, solo tendrías que adecuarlo a tus necesidades...

Objeto.
Código
  1. public class PojoA {
  2. private String Campo1;
  3. private String Campo2;
  4. private String Campo3;
  5.  
  6. public String getCampo1() {
  7. return Campo1;
  8. }
  9.  
  10. public void setCampo1(String campo1) {
  11. Campo1 = campo1;
  12. }
  13.  
  14. public String getCampo2() {
  15. return Campo2;
  16. }
  17.  
  18. public void setCampo2(String campo2) {
  19. Campo2 = campo2;
  20. }
  21.  
  22. public String getCampo3() {
  23. return Campo3;
  24. }
  25.  
  26. public void setCampo3(String campo3) {
  27. Campo3 = campo3;
  28. }
  29. }
  30.  

Main.
Código
  1. public class ClaseMain {
  2. public static void main(String[] args) {
  3. for (PojoA i : llenarLista()){
  4.            System.out.println("NOMBRE: " + i.getCampo1() + " APELLIDO: " + i.getCampo2() + " ANIME: " + i.getCampo3());
  5.        }
  6. }
  7.  
  8. public static List<PojoA> llenarLista(){
  9. List<PojoA> list = new ArrayList<PojoA>();
  10. PojoA a = new PojoA();
  11. a.setCampo1("Yuno");
  12.        a.setCampo2("Gasai");
  13.        a.setCampo3("Mirai Nikki");
  14.        list.add(a);
  15.  
  16.        a = new PojoA();
  17.        a.setCampo1("Asuna");
  18.        a.setCampo2("Yuuki");
  19.        a.setCampo3("Sword Art Online");
  20.        list.add(a);
  21.  
  22.        a = new PojoA();
  23.        a.setCampo1("Hinata");
  24.        a.setCampo2("Hyuga");
  25.        a.setCampo3("Naruto");
  26.        list.add(a);
  27.  
  28.        return list;
  29. }
  30. }
  31.  

Primeramente lo que hacemos es crear una clase el cual contendrá todos los campos que necesitemos, para este ejemplo los eh declarado del tipo String pero tu puedes declararlos de acuerdo a tus necesidades, para cada campo creamos sus respectivos métodos Set/Get los cuales son los métodos encargados de manipular el contenido que tendrá el campo, todo esto lo podrás ver en la clase PojoA.

Posteriormente hice un método el cual me retornara una lista del tipo PojoA, dentro del método instanciamos a mi objeto para ir colocando los valores a través de los métodos Set cuando termino de colocar los valores a los campos los agrego a una lista, instancio un nuevo objeto para volver a llenar con valores nuevos ya que sino el valor sera el mismo para todos, el proceso se repite una vez mas con el fin de tener dentro de mi objeto 3 registros en total.

Finalmente retorno la lista y al ejecutar mi proyecto, recorro la lista de acuerdo al tipo de objeto al que pertenece; es decir, no puedo recorrer una lista de objetos del tipo PojoB cuando mi lista es del tipo PojoA, e imprimo los valores a través de los métodos Get.

Cualquier duda y/o inconveniente, aquí estamos. Suerte!


Título: Re: Array Bidimensional de objetos
Publicado por: Nafko en 16 Abril 2015, 00:47 am
 ;-) ;-) ;-) ;-) ;-)

Muchas gracias en tal caso no hay necesidad de crear una matriz, solo un vector pero si tengo que seleccionar por medio de un random a 10 clientes con sus respectivos datos como lo aria en ese caso, tendría que crear una matriz para poder seleccionar los 10 clientes y mostrarlos por pantalla, por ese motivo además para hacer la suma total de ingreso diario y mensual.

Creo que si necesito una matriz de objetos para poder seleccionar y sumar los datos.


Título: Re: Array Bidimensional de objetos
Publicado por: Lind L. Tailor en 16 Abril 2015, 04:37 am
Hola...

Pues eso no le veo problema, solo que tendríamos que cambiar la Interface a implementar...

PojoA
Código
  1. public class PojoA {
  2. private int id;
  3. private String Campo1;
  4. private String Campo2;
  5. private String Campo3;
  6.  
  7. public int getId() {
  8. return id;
  9. }
  10.  
  11. public void setId(int id) {
  12. this.id = id;
  13. }
  14.  
  15. public String getCampo1() {
  16. return Campo1;
  17. }
  18.  
  19. public void setCampo1(String campo1) {
  20. Campo1 = campo1;
  21. }
  22.  
  23. public String getCampo2() {
  24. return Campo2;
  25. }
  26.  
  27. public void setCampo2(String campo2) {
  28. Campo2 = campo2;
  29. }
  30.  
  31. public String getCampo3() {
  32. return Campo3;
  33. }
  34.  
  35. public void setCampo3(String campo3) {
  36. Campo3 = campo3;
  37. }
  38. }
  39.  

Main
Código
  1. public class ClaseMain {
  2. public static void main(String[] args) {
  3. Random  rnd = new Random();
  4. int id = rnd.nextInt(3)+1;
  5. int size = llenarHashMap().size();
  6. int total = 0;
  7. System.out.println("Id: " + llenarHashMap().get(id).getId() +
  8. " Nombre: " + llenarHashMap().get(id).getCampo1() +
  9. " Apellido: " + llenarHashMap().get(id).getCampo2() +
  10. " Anime: " + llenarHashMap().get(id).getCampo3());
  11.  
  12. for(int i = 1; i <= size; i++){
  13. total += llenarHashMap().get(i).getId();
  14. }
  15.  
  16. System.out.println("TOTAL: " + total);
  17. }
  18.  
  19. public static HashMap<Integer,PojoA> llenarHashMap(){
  20. HashMap<Integer,PojoA> map = new LinkedHashMap<Integer,PojoA>();
  21. PojoA a = new PojoA();
  22. a.setId(1);
  23. a.setCampo1("Yuno");
  24.                a.setCampo2("Gasai");
  25.                a.setCampo3("Mirai Nikki");
  26. map.put(a.getId(),a);
  27.  
  28. a = new PojoA();
  29. a.setId(2);
  30. a.setCampo1("Asuna");
  31.                a.setCampo2("Yuuki");
  32.                a.setCampo3("Sword Art Online");
  33. map.put(a.getId(),a);
  34.  
  35. a = new PojoA();
  36. a.setId(3);
  37. a.setCampo1("Hinata");
  38.                a.setCampo2("Hyuga");
  39.                a.setCampo3("Naruto");
  40. map.put(a.getId(),a);
  41.  
  42. return map;
  43. }
  44. }
  45.  

Como podemos observar, en vez de implementar la Interface List cambiamos a un HashMap que a su vez hereda de la clase Map siendo esta la clase padre, sin embargo, eh leído que HashMap tiene un poco mas de rapidez cuando se trata de gran cantidad de datos, aunque sigo buscando una diferencia que me convenza. Cabe mencionar que la característica importante que tiene nuestro elemento en particular es que se caracteriza por su estructura; HashMap (K,V), donde K significa nuestro identificador (Key) que tendrá V (value) que viene siendo el valor correspondiente a ese Key. Para mayor información te invito a consultar la API de Java para que puedas comprender con mejor claridad.

También realice un cambio a nuestro objeto ya que agregue un campo mas el cual es el identificador (Id) como podrás ver en la clase PojoA, además realice un cambio a nuestro método el cual me retornara un HashMap<Integer,PojoA>, esto significa que como Key le declaro un entero y como valor le declaro un objeto. Posteriormente llenamos el K y el V correspondiente como puedes ver en el código.

Finalmente, solo es cuestión de generar un numero aleatorio entre 1 al 3, la razón de sumarle un 1 al final es porque sino nos genera números del 0 al 2. Pasamos a imprimir el valor correspondiente de acuerdo al numero que el HashMap identificara como Key. Como ya lo que tiene V es un objeto lleno, entonces puedo acceder a los valores de el mediante los métodos Get.

Para tu problema de la suma, yo estoy sumando el ID pero obviamente tu sumarías el valor que tengas que sumar, el proceso es simple ya que como puedes ver es simplemente un bucle for y acceder a los valores que tiene el campo que voy a sumar de acuerdo al K que le voy a pasar.

Cualquier duda y/o inconveniente, aquí estamos. Suerte!


Título: Re: Array Bidimensional de objetos
Publicado por: Nafko en 18 Abril 2015, 21:09 pm
Gracias de verdad me ayudaste mucho cualquier duda o sugerencia ya se donde plantearla  :silbar:



Título: Re: Array Bidimensional de objetos
Publicado por: Nafko en 18 Abril 2015, 22:12 pm
Ola sabe tengo una duda para poder rellenar los campos manualmente. Al ingresar por teclado porque lo intente de esta manera pero no sirvió.

Código:
       

System.out.println("Ingresar nombre de Cliente: ");
String nom=bf.readLine();
a.setCampo1(nom);



Título: Re: Array Bidimensional de objetos
Publicado por: Nafko en 18 Abril 2015, 22:16 pm
Me hace ingresar 4 veces los usuarios y me manda un id 1 siempre :(


Título: Re: Array Bidimensional de objetos
Publicado por: Usuario Invitado en 18 Abril 2015, 23:09 pm
Coloca el código donde muestra el error. Importante es dedicarse a leer el rastreo de pila que bota el compilador que para eso está, para leerlo.


Saludos.


Título: Re: Array Bidimensional de objetos
Publicado por: Nafko en 19 Abril 2015, 00:39 am
No me tira ningún error al ingresar los datos solo me hace ingresar 4 veces los usuarios y tira siempre un id de 1 creo que no hay donde leer  ;-)


Título: Re: Array Bidimensional de objetos
Publicado por: Usuario Invitado en 19 Abril 2015, 01:07 am
¿Y el código? No sé si has editado el código que te han dado
. Si es así, colócalo (entre etiquetas de código) para ver el flujo del algoritmo y poder ver el error.


Título: Re: Array Bidimensional de objetos
Publicado por: Lind L. Tailor en 19 Abril 2015, 22:06 pm
Efectivamente, por favor, coloca el código con tus adecuaciones para ver el error, sin embargo, por lo que comentas posiblemente tienes esa línea de código en un bucle y si se repite el ID posiblemente es que no estas creando un nuevo objeto cuando insertas un nuevo registro.

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos. Suerte!


Título: Re: Array Bidimensional de objetos
Publicado por: Nafko en 20 Abril 2015, 07:55 am
Seria algo así pero ahora el problema esta en el ingreso de el 2do cliente al hacer la muestra por pantalla me tira error de los get y set algo esta mal pero no se que desde ya gracias

Código:
import java.io.*;
import java.util.*;

public class Test {
  
    
public static void main(String[] args) throws IOException {
Random  rnd = new Random();
int id = rnd.nextInt(3)+1;
int size = llenarHashMap().size();
int total = 0;
System.out.println("Id: " + llenarHashMap().get(id).getId() +
" Nombre: " + llenarHashMap().get(id).getNombre() +
" RUT: " + llenarHashMap().get(id).getRUT() +
" Tipo de Sala: " + llenarHashMap().get(id).getSala()+
                                                        "Total"+llenarHashMap().get(id).getTotal());
 
for(int i = 1; i <= size; i++){
total += llenarHashMap().get(i).getId();
}
 
System.out.println("TOTAL: " + total);
}
 
public static HashMap<Integer,Conn> llenarHashMap() throws IOException{
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            
HashMap<Integer,Conn> map = new LinkedHashMap<Integer,Conn>();
Conn a = new Conn();
a.setId(1);
                System.out.println("Nombre de Cliente: ");
                String nom=bf.readLine();
a.setNombre(nom);
                System.out.println("RUT: ");
                String rut=bf.readLine();
                a.setRUT(rut);
                System.out.println("Tipo de sala: ");
                String TipoSala=bf.readLine();
                a.setSala(TipoSala);
                System.out.println("Ingresar Total del valor: ");
                int total=Integer.parseInt(bf.readLine());
                a.setTotal(total);
map.put(a.getId(),a);
 

 
return map;
}
}

y Constructor

Código:
public class Conn {
private int id;
private String Nombre;
private String RUT;
private String Sala;
        private int total;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNombre() {
        return Nombre;
    }

    public void setNombre(String Nombre) {
        this.Nombre = Nombre;
    }

    public String getRUT() {
        return RUT;
    }

    public void setRUT(String RUT) {
        this.RUT = RUT;
    }

    public String getSala() {
        return Sala;
    }

    public void setSala(String Sala) {
        this.Sala = Sala;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }
 

}


Título: Re: Array Bidimensional de objetos
Publicado por: Usuario Invitado en 20 Abril 2015, 21:19 pm
Veo mucha redundancia en tu código, llamas demasiadas veces a llenarHashMap() cuando debe llenarse solo una vez.

Código
  1. Map<Integer, Conn> conns = llenarHashMap();
  2. printInfoOf(conns.get(generateInt(1, 3);
  3.  
  4. public static Integer generateInt(int minimun, int limit) {
  5.    Random random = new Random(System.nanoTime());
  6.    return minimun + random.nextInt(limit);
  7. }
  8. public static void printInfoOf(Conn conn) {
  9.    System.out.println("ID: "+conn.getId()+"\nNombre: "+conn.getNombre()+
  10.        "\nRUT: "+conn.getRUT()+"\nTipo de sala: "+conn.getSala()+"\nTotal: "+conn.getTotal());
  11. }

Cada llamada a HashMap está ingresando nuevos datos. Debes de pensar en el flujo del algoritmo:

1) Ingreso los objetos Conn (ni idea de que trate de decir).
2) Generar un ID aleatorio.
3) Obtenerlo del Map.
4) Imprimir su información.

El punto 1, me lleva también a recomendarte que te leas el tema "Buenas prácticas en Java", que está pegado en éste mismo foro, para que aprendas que:

  • Las variables en Java utilizan notación camelCase. Ej. nroRut.

Entre muchas otras cosas que todo programador Java debe saber.


Saludos.


Título: Re: Array Bidimensional de objetos
Publicado por: WHK en 20 Abril 2015, 22:24 pm
En java puro y duro también uso los HashMap, pero en el SDK de Android (en java) utilizo JSONObject porque es mas fácil e intuitivo para trabajar ya que no necesitas definir los tipos de valores como en HashMap<T, T>. No se si sea tu caso.


Título: Re: Array Bidimensional de objetos
Publicado por: Usuario Invitado en 20 Abril 2015, 23:09 pm
JsonObject del paquete javax.json, se usa más cuando se trabaja con WebSockets y Decoders/Encoders. En su caso, se haría:

Código
  1. JsonObject value = Json.createObjectBuilder()
  2.     .add("id", VALOR)
  3.     .add("nombres", "VALOR")
  4.     .add("rut", "VALOR")
  5.     .add("sala", "VALOR")
  6.     .add("total", VALOR)
  7.     .build();

Si lo ves más práctico, pues usalo en lugar de HashMap. Yo seguiría usando HashMap. Si quieres una llave multitipo, puedes usar <Object, Object>, que ya sería muy genérico y tendría que hacerse muchos casting, por lo que me inclinaría a usar JSON como dijo WHK.


Saludos.


Título: Re: Array Bidimensional de objetos
Publicado por: WHK en 21 Abril 2015, 14:38 pm
A demás de ser mas cómodo el objeto JSON tiene muchas mas propiedades que un HashMap como por ejemplo la posibilidad de ser llevado a otras capas o lenguajes tales como javascript, solicitudes HTTP/POST directas sin tener que utilizar serializaciones ya que jsonobject lo hace de manera nativa, puedes pasarlo como valor serializable como transporte de datos entre capas de modelos y controladores de manera mas efectiva (como por ejemplo la posibilidad de retornar múltiples valores en ves de un solo tipo por función, como en mi caso cuando devuelvo un objeto json con el estado de la solicitud, valores y el id autoincrementable).

Un HashMap a pesar de que también puedes manejar arrays multidimensionales con llaves de tipos no puede ser transportado ni manipulado con tanta facilidad como un objeto json.

En mi caso en un proyecto php las funciones retornan un objeto de tipo array (ya que en php las llaves de los arrays pueden ser objetos como strings) el cual contiene el estado, namespace de error, texto de error y datos solicitados, de esa manera no necesito utilizar variables locales ni almacenar un stack de estados como se hace generalmente y uso una clase de errores para completar el id de estado, namespace y texto el cual puede contener un array de errores como por ejemplo el controlador del login de un acceso a un portal, pueden haber errores como por ejemplo que el campo nick falta o el campo nick y password falta o que le faltó la captcha, etc... entonces encapsulo todo en un ñunico objeto y lo retorno y lo proceso y lo documento dentro de la misma función.

En Java no hago esto xD porque java es mas estructurado pero si cuando necesito crear objetos serializables en el modelo utilizo mucho los valores en jsonobject para poder sincronizarlos con el servidor web desde una aplicación móvil ya que solamente debo serializarlos de manera nativa y enviar y recibir. Afortunadamente el objeto json está disponible en casi todo lenguaje de programación conocido tales como java, javascript, php, .net, etc por lo cual su utilización para mi es muy cómoda cuando se trata de crear un sistema que se deba mantener comunicado con otras capas u otros servicios y te sirve para acostumbrarte a su uso cuando necesites utilizar apis en internet como google maps, cuentas de gmail, apple, twitter, amazon aws, etc.


Título: Re: Array Bidimensional de objetos
Publicado por: WHK en 21 Abril 2015, 14:42 pm
Seria algo así pero ahora el problema esta en el ingreso de el 2do cliente al hacer la muestra por pantalla me tira error de los get y set algo esta mal pero no se que desde ya gracias

Copia y pega acá el mensaje de error para tener una referencia mas clara.


Título: Re: Array Bidimensional de objetos
Publicado por: Usuario Invitado en 21 Abril 2015, 14:56 pm
No importa qué es más cómodo, si no lo que mejor se adapte al proyecto. Yo cuando trabajo, siempre uso JSON o JAXB/Jackson cuando quiero transportar entidades y ésto es mucho más cómodo. Envías una entidad de microservicio a microservicio o mediante peticiones y ésta llega íntegra al destino, ya no necesitas estar convirtiendo de JSON a entidad. Un HashMap también es serializable por cierto.

Hay que usar siempre lo que mejor se adapte a las necesidades. Para casos sencillos como éste, no le veo mucho sentido usar JSON ya que no se va a trabajar con peticiones, si no que será estático, se está simulando una BBDD.

Saludos.


Título: Re: Array Bidimensional de objetos
Publicado por: WHK en 21 Abril 2015, 14:59 pm
Acabo de compilar tu código y Gus Garsaky tiene razón, intentas pedir datos en una función y replicas en otras y luego sumas los ids no se para que, está bien raro el código. Podrías explicarnos de que se trata como para poder ayudar a corregirlo?


Título: Re: Array Bidimensional de objetos
Publicado por: WHK en 21 Abril 2015, 15:07 pm
No importa qué es más cómodo, si no lo que mejor se adapte al proyecto. Yo cuando trabajo, siempre uso JSON o JAXB/Jackson cuando quiero transportar entidades y ésto es mucho más cómodo. Envías una entidad de microservicio a microservicio o mediante peticiones y ésta llega íntegra al destino, ya no necesitas estar convirtiendo de JSON a entidad. Un HashMap también es serializable por cierto.

Hay que usar siempre lo que mejor se adapte a las necesidades. Para casos sencillos como éste, no le veo mucho sentido usar JSON ya que no se va a trabajar con peticiones, si no que será estático, se está simulando una BBDD.

Saludos.

No, no está simulando una db, ese tipo de clases se llaman parcelables o serialización (método get, set) y sirven para ser transportados de manera nativa entre dos aplicaciones o capas, mantener orden y estándard:
http://www.discoduroderoer.es/metodos-get-y-set-en-java/

En .net el método { get; set; } se realiza de manera automática y ya viene con definiciones por defecto salvo que hagas get y set personalizados (útiles cuando necesitas realizar calculos cada ves que se guarda u obtiene un dato como por ejemplo obtener el sexo de una persona cuando solo tienes el valor booleano si es hombre o no o valor nulo).

El tema principal es que no entiendo la lógica del proyecto.


Título: Re: Array Bidimensional de objetos
Publicado por: Usuario Invitado en 21 Abril 2015, 19:38 pm
Citar
No, no está simulando una db, ese tipo de clases se llaman parcelables o serialización (método get, set) y sirven para ser transportados de manera nativa entre dos aplicaciones o capas, mantener orden y estándard:
http://www.discoduroderoer.es/metodos-get-y-set-en-java/

En .net el método { get; set; } se realiza de manera automática y ya viene con definiciones por defecto salvo que hagas get y set personalizados (útiles cuando necesitas realizar calculos cada ves que se guarda u obtiene un dato como por ejemplo obtener el sexo de una persona cuando solo tienes el valor booleano si es hombre o no o valor nulo).

Eso se llama POJO en Java y el concepto de Serialización no aplica obligatoriamente a ellos. En Java, un POJO es una abstracción, una representación de una entidad específica.

Lo que desea aquí (al menos lo que yo tengo entendido), es crear una colección de objetos, una colección simple. ¿Dónde ves necesario el uso de JSON? ¿Donde se está enviando datos a través de peticiones? ¿Para qué es necesaria la serialización aquí?

La serialización de un objeto consiste en obtener una secuencia de bytes que represente el estado de dicho objeto. Esta secuencia puede utilizarse de varias maneras (puede enviarse a través de la red, guardarse en un fichero para su uso posterior, utilizarse para recomponer el objeto original, etc).

¿Puedes pensar en Serialización, cuando el único requerimiento es usar una colección para guardar objetos allí?

El OP no ha especificado requerimiento alguno que indique que el objeto debe ser guardado, leído, transportado, que debe ser persistido.