Java - Saber cuántos objetos tengo con determinados atributos

   
Vista:
Imágen de perfil de Jhon

Saber cuántos objetos tengo con determinados atributos

Publicado por Jhon (14 intervenciones) el 30/12/2015 11:27:06
Saludos a todos.
Creo que no quedó muy claro en el título lo que busco, pero trataré de explicarlo mejor.
Tengo un ejercicio sobre arreglos y colecciones que consiste en crear una clase Main, una clase Atleta y una clase Competencia.
La clase Atleta es para crear unos objetos que tienen los siguientes atributos: nombre, nacionalidad, tiempo.
La clase Competencia es para obtener el tiempo promedio, el listado de atletas, quién fue el campeón, etc.
Ya todo eso lo hice pero me quedé atascado con una cosa.
Se supone que debo calcular cuántos atletas hay de cada país participante. Es decir, calcular cuántos atletas son de España, cuántos de Colombia, cuántos de Cuba, etc.
No hay un número fijo de países ni de atletas, en cada ejecución meto los que me da la gana.

Tengo una idea vaga de usar un hash para saber cuántos países son, y crear un arreglo con esa extensión pero no sé muy bien cómo concretarla.

¿Alguna sugerencia?
Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Danny

Saber cuántos objetos tengo con determinados atributos

Publicado por Danny (7 intervenciones) el 30/12/2015 22:52:56
Has considerado utilizar sesiones para tal finalidad? de todas maneras de toda la informacion que has detallado, la unica clase que ta la informacion que estas buscando es la clase Atleta, por lo que podrias poner los datos de nacionalidad y nombre en una sesion, asi podras determinar cuantos atletas hay por nacionalidad, saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jhon

Saber cuántos objetos tengo con determinados atributos

Publicado por Jhon (14 intervenciones) el 31/12/2015 13:54:30
Ni sabía que existía algo llamado sesiones. Investigaré el asunto.
Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Saber cuántos objetos tengo con determinados atributos

Publicado por Marcelo (47 intervenciones) el 31/12/2015 16:32:22
Si quieres hacerlo con un HashMap podrias tenerlo en su clase principal (donde tienes la lista de Atletas) y al insertar un nuevo atleta evaluas el hash de la siguiente forma

tu hash seria asi
1
HashMap<String,Integer> cantidades = new HashMap<String,Integer>()

y al insertar un nuevo atleta harias lo siguiente

1
2
3
4
5
if(cantidades.containsKey(atleta.getNacionalidad())){
         cantidades.put(atleta.getNacionalidad(), cantidades.get(atleta.getNacionalidad())+1);
}else{
         cantidades.put(atleta.getNacionalidad, 1);
}

y asi puedes almacenar las cantidades de atletas por país a medida que van ingresando a tu sistema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Danny

Saber cuántos objetos tengo con determinados atributos

Publicado por Danny (7 intervenciones) el 31/12/2015 18:30:30
El inconveniente de un hash es que solo te guardara los datos para una ejecucion, no quedara respaldo si vuelves a ejecutar el metodo en el que ingresas mas atletas, con una sesion eso no pasa, pues los datos permanecen ahi sin importar el numero de veces que ejecutes el metodo, hasta que mates dicha sesion o hasta que la sesion muera
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Saber cuántos objetos tengo con determinados atributos

Publicado por Marcelo (47 intervenciones) el 31/12/2015 20:35:49
No me queda del todo claro tu afirmacion.
Pero si el hash es atributo de la clase controladora del sistema los datos no se pierden entre ejecucion de metodos.
Si interesa guardar esa informacion al cerrar el programa se puede serializar el objeto al finalizar (o cuando se quiera) y cargar al abrir (o cuando se quiera) sin mayor trabajo. al mejor estilo cookie

Todo depende de lo que se quiera
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

Saber cuántos objetos tengo con determinados atributos

Publicado por Jhon (14 intervenciones) el 31/12/2015 21:49:12
En este caso el método for en el que se crean los nuevos atletas sólo se ejecuta una vez.
Igualmente voy a estudiar en tema de las sesiones porque no lo conocía.
:)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

Saber cuántos objetos tengo con determinados atributos

Publicado por Jhon (14 intervenciones) el 31/12/2015 21:46:22
Cuando llegue al pc con java lo probaré.
!Muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

Saber cuántos objetos tengo con determinados atributos

Publicado por Jhon (14 intervenciones) el 01/01/2016 09:42:52
Hola, tengo un problema con el hashmap (Supongo que porque lo estoy usando mal. La variable "pais" que es la que se asigna como nacionalidad de mi objeto atleta (No usé setters y getters), la estoy añadiendo a mi hashmap en el ciclo for en el que voy creando objetos atleta.
Algo así:

1
2
3
public void mapaAtletas(String pais){
  this.cantidades.put(pais, 1);
  }

Cada país que se va añadiendo comienza con un valor de uno (Tengo entendido que hashmap no acepta claves repetidas). Ahora quiero que si ya existe el valor aumente 1. Para eso supongo que es el código tuyo ya que deduzco que containskey es para eso, para ver si ya existe esa clave.
Intenté adaptar tu código a mi problema:

1
2
3
4
5
6
7
public void contarAtletasXPais(String pais){
        if(cantidades.containsKey(pais)){
         cantidades.put(pais, cantidades.get(pais)+1);
    }else{
         cantidades.put(pais, 1);
        }
    }

Pero en realidad al hacerlo así, aumentan todos los países en uno al añadir un nuevo atleta. Es decir que si creo el atleta fulano de Colombia, el creara fulano = 1, agrego a sutano de España y quedan Colombia = 1 y España = 1.
Eso por el primer código.
Pero si agrego ahora a fulano2 de españa deberían quedarme dos de España y no de COlombia pero me queda en realidad Colombia = 2, España = 2.

¿Qué estoy haciendo mal?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Saber cuántos objetos tengo con determinados atributos

Publicado por Marcelo (47 intervenciones) el 01/01/2016 17:07:39
Tu orientacion es la correcta, el containsKey es para ver si ya tenes el pais agregado o no y tomar las acciones correspondiente. Tambien es correcto que el hasmap no acepta clave repetidas (si ingresas una clave que ya tenes te remplaza el valor del que tiene por el nuevo ingresado).

Podras postear tu codigo para que pueda analizarlo? Debe ser alguna tonteria seguramente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jhon

Saber cuántos objetos tengo con determinados atributos

Publicado por Jhon (14 intervenciones) el 01/01/2016 17:21:32
No es muy prolijo y me he comido mcuhas buenas prácticas como usar setters y getters en "Atlteas" (Lo haré jejeje) o hacer anotaciones. Espero que se entienda:
El ejercicio me pedía espcíficamente usar tres clases (Atletas, Competencia y Main).

Clase Atletas (No tiene nada excepto los atributos):

1
2
3
4
5
6
7
8
9
10
11
12
public class Atletas {
    String nombre;
    String nacionalidad;
    float tiempo;
    protected Atletas(String nombre, String nacionalidad, float tiempo){
        this.nombre = nombre;
        this.nacionalidad = nacionalidad;
        this.tiempo = tiempo;
    }
//No usé setters y getters
 
}


Clase Competencia:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class Competencia{
    protected ArrayList<Atletas> competidores;
    protected HashMap<String,Integer> cantidades;
 
    public Competencia() {
        this.cantidades = new HashMap<>();
        this.competidores = new ArrayList<Atletas>(); //El constructor debe ser inicializado o dará error
 
    }
    /**
     *
     * @param atleta es un objeto de la clase Atletas.
     */
    public void addAtleta(Atletas atleta){
 
        this.competidores.add(atleta); //Añade un nuevo objeto al arreglo
    }
    public void mostrarCampeon(){
        float menorTi = this.competidores.get(0).tiempo; //Por defecto el primer concursante es el campeón a menos que alguien lo haga mejor
        String campeon = this.competidores.get(0).nombre;
        String paisCamp = this.competidores.get(0).nacionalidad;
        for (int i = 0; i < this.competidores.size(); i++){
            if (this.competidores.get(i).tiempo < menorTi){
               menorTi = this.competidores.get(i).tiempo;
               campeon = this.competidores.get(i).nombre;
               paisCamp = this.competidores.get(i).nacionalidad;
            }
        }
        System.out.println("El menor tiempo fue de " + menorTi);
        System.out.println("Por tanto, el ganador es: " + campeon + " de " + paisCamp);
    }
 
    public void mostrarTodos(){
        System.out.println("Los competidores son: ");
        for (int i = 0; i < this.competidores.size(); i++){
        System.out.println ("Atleta N°" + (i+1) +": " + this.competidores.get(i).nombre + " de " + this.competidores.get(i).nacionalidad + " con un tiempo de: " + this.competidores.get(i).tiempo);
        }
    }
 
    public void tiempoPromedio(){
        float suma = 0; //Inicializamos en 0
        for (int i = 0; i < this.competidores.size(); i++){
            suma = suma + this.competidores.get(i).tiempo;
        }
        float promedio = suma / this.competidores.size(); //La suma de los tiempos dividida entre la cantidad de atletas
        System.out.println("El tiempo promedio de competencia fue: " + promedio);
    }
 
 
    public void mapaAtletas(String pais){
        this.cantidades.put(pais, 1);
    }
    public void contarAtletasXPais(String pais){
        if(cantidades.containsKey(pais)){
         cantidades.put(pais, cantidades.get(pais)+1);
    }else{
         cantidades.put(pais, 1);
        }
    }
}

Clase Main:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Main {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Escriba el número de competidores:");
        int numComp = in.nextInt();
        Competencia torneo = new Competencia();
            for (int i = 0; i < numComp; i++) {
            System.out.println("Nombre del atleta " + (i+1) + ": ");
            String nomb = in.next();
            System.out.println("Nacionalidad del atleta " + (i+1) + ": ");
            String pais = in.next();
            System.out.println("Tiempo del atleta " + (i+1) + ": ");
            float time = in.nextFloat();
            Atletas atleta = new Atletas(nomb, pais, time);
            torneo.addAtleta(atleta);
            torneo.mapaAtletas(atleta.nacionalidad);
            torneo.contarAtletasXPais(pais);
        }
        torneo.mostrarTodos();
        torneo.mostrarCampeon();
        torneo.tiempoPromedio();
        System.out.println(torneo.cantidades.entrySet()); //Aquí voy mirando si funciona lo del hashmap :)
    }
}

Muchas gracias por tu colaboración.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Saber cuántos objetos tengo con determinados atributos

Publicado por Marcelo (47 intervenciones) el 01/01/2016 22:40:41
Todavia no lo corri en una pc, pero a modo de adelanto, borra la linea mapaAlteltas, dado que lo unico que hace es agregar al pais con el contador en 1 y como esta dentro del for, si el contarAtletasXPais suma algo, el metodo anterior le resetea el contador 1 (ademas el contarAlteltasXPais hace lo mismo que mapaAtletas y lo complementa para que cuenta los atletas por pais).

En cuanto tenga una pc con java te subo el codigo andando
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Jhon

Saber cuántos objetos tengo con determinados atributos

Publicado por Jhon (14 intervenciones) el 01/01/2016 23:50:02
Eres un crack Marcelo. Tenías razón sobre la línea mapaAtletas, venía a hacer lo mismo que hacía el else.
Ya hice la prueba con esas correciones y va de perlas.
Te agradezco mucho tu ayuda :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Saber cuántos objetos tengo con determinados atributos

Publicado por Marcelo (47 intervenciones) el 02/01/2016 01:43:23
Me alegra mucho haber sido de ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar