Java - Contador Java

 
Vista:
sin imagen de perfil

Contador Java

Publicado por Sergio (3 intervenciones) el 27/02/2023 00:41:11
Hola buenas tardes, actualmente estoy tratando de entender el lenguaje de JAVA estoy en un curso pero no puedo avanzar el problema es el siguiente :
En una exposición canina se realizan desfiles de ejemplares de diferentes razas. De cada ejemplar se manejan
la siguiente información: nombre (el cual debe ser único en toda la exposición), raza, edad y puntos otorgados
en la exposición.
El cliente necesita una aplicación que permita manipular la información de los participantes de los desfiles
caninos. Además de la información básica, se tiene también la foto de cada perro.
La aplicación debe (1) mostrar la lista de los perros registrados en la exposición, ordenada por raza, puntos o
edad, (2) mostrar la información de un perro específico, (3) registrar un nuevo perro, (4) localizar un perro por su
nombre, (5) buscar el perro ganador de la exposición (el que tiene un mayor puntaje asignado), (6) buscar el
perro con el menor puntaje y (7) buscar el perro más viejo de todos (con mayor edad).

Me piden generar lo siguiente:
Se desea extender el ejercicio de la Exposición Canina. Se quieren incluir estos nuevos requerimientos: • Ordenar el vector de perros por edad, en orden descendente.
Lo ordene de la siguiente manera:

/**
* Ordena el vector de perros de forma descendente por raza, usando el algoritmo burbuja
*/
public void ordenarPorRazaDesc()
{
for (int i = perros.size() ; i > 0; i--)
{
for (int j = 0; j < i-1; j++)
{
Perro uno = (Perro)perros.get(j);
Perro dos = (Perro)perros.get(j+1);
if (dos.darRaza().compareTo(uno.darRaza()) > 0)
{
perros.set(j, dos);
perros.set(j + 1, uno);
}
}
}
}

NO ME GENERA ERROR PERO EL SIGUIENTE PUNTO A DESARROLLAR SI , QUE ES EL SIGUIENTE:

En la clase ExposicionPerros, cree el método darRazaMasPopular(), que retorna la raza más popular de la exposición a partir del vector ordenado descendentemente por raza (el cual puede obtener llamando el método del punto anterior)

Lo que pensaba era que al tener ordenado por raza, significa que todos los perros de la misma raza quedan consecutivos en el vector. Podria crear un contador que vaya sumando de a 1 hasta que identifique que se cambia de raza pero no se como hacerlo en codigo
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 Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Contador Java

Publicado por Kabuto (1381 intervenciones) el 27/02/2023 18:12:07
Necesitas dos enteros:
- un contador para contar la cantidad de veces que se va repitiendo una raza
- el otro entero para guardar el mayor valor que alcance el contador anterior. Así cuando cambies de raza, si el contador es mayor que el valor anteriormente guardado, entonces le asignas este nuevo valor mayor.

También necesitarás dos String:
- uno para guardar la raza que estás contando actualmente.
- otro para guardar el nombre de la raza que esté obteniendo el mayor valor de conteo.

La idea es ir recorriendo los perros y al comenzar con una nueva raza, guardar dicha raza como "raza actual" e iniciar el contador.
Mientras vayas encontrando la misma raza, vas incrementando dicho contador.

Cuando encuentres una raza nueva, si el contador supera al valor guardado como "mayor conteo", entonces guardas el nombre de la raza actual y el valor del contador como los mayores, o sea, los más populares.
Y tras esto, es cuando ya puedes reiniciar el contador y guardar la nueva raza encontrada como la "actual", para poder comenzar un nuevo conteo.

Quizás se entienda mejor si ves un código.


Como no tengo tu clase, ni el resto del código, hago un ejemplo sencillo a mi manera utilizando un array de String con razas ya agrupadas para poder hacer los conteos.
Tú luego solo tienes que adaptarlo a tu código aplicando la misma lógica.

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
public class ContarRaza {
 
	public static void main(String[] args) {
 
		String[] razas = {"Pastor Aleman","Pastor Aleman","Pastor Aleman","Doberman","Doberman",
				"Doberman","Pastor Belga","Labrador","Labrador","Labrador","Labrador","Labrador",
				"TerraNova", "TerraNova"};
 
		String razaActual = "", razaMayor = "";
		int contActual = 0, contMayor = 0;
 
		for (int i = 0; i < razas.length; i++) {
			if (razaActual.equals(razas[i])) { //Misma raza que la actual
				contActual++; //Incrementamos contador
			}
			else { //Nueva raza encontrada.
				//Comprobamos si la raza anterior, es (por ahora) la mas popular
				if (contActual > contMayor) { //Sí lo es
					contMayor = contActual; //Memorizamos el contador mayor
					razaMayor = razaActual; //y la raza mayor (mas popular de momento)
				}
				//Tras comprobar, comenzamos a evaluar la nueva raza actual
				contActual = 1; //Inicializamos contador
				razaActual = razas[i]; //Memorizamos razaActual
			}
		}
 
		//Listo, podemos mostrar resultado
		System.out.println("Raza mas popular: " + razaMayor);
		System.out.println("Cantidad perros de esta raza: " + contMayor);
 
	}
 
}

Si lo ejecutamos, veremos que determinar correctamente cuál es la raza más "popular"
1
2
Raza mas popular: Labrador
Cantidad perros de esta raza: 5

Pues eso, solo tienes que adaptarlo. El bucle y los if son los mismos. Solo cambia que tu has de usar objetos de tu clase Perro en lugar de String
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
sin imagen de perfil

Contador Java

Publicado por Sergio (3 intervenciones) el 01/03/2023 02:29:03
Muchas Gracias por tu apoyo lo probare
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 Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Contador Java

Publicado por Kabuto (1381 intervenciones) el 01/03/2023 18:18:04
Contesto por aquí a las dudas que me has pasado por privado.

Primero, de todo, quisiera comentar una cosa:

Cuando usemos ArrayList, u otras colecciones que provengan de las interfaces List y Set, siempre es mejor indicar entre llaves el tipo de dato/clase que van a contener.

Aquí no lo estamos indicando:
1
private ArrayList perros;
Y Java lo acepta, pero no es lo ideal y de hecho muchos IDE's marcarán una advertencia (no un error) para esa línea indicando que debería indicarse un tipo.

Puesto que en este caso va a contener objetos de la clase Perro, lo indicamos así:
1
private ArrayList<Perro> perros;

También deberíamos hacerlo en su constructor:
1
2
3
4
public ExposicionPerros( )
    {
        perros = new ArrayList<Perro>( );
    }

E incluso, al indicar el tipo de retorno de los métodos:
1
2
3
4
5
6
7
8
9
/**
     * Retorna una lista de perros. La lista que se retorna no es la misma que la almacenada en esta clase, pero si tiene el mismo orden.
     * @return Lista de perros
     */
    public ArrayList<Perro> darPerros( )
    {
        return new ArrayList<Perro>(perros);
 
    }

Como dije, no es obligatorio, pero sí recomendable. Es una forma de asegurar que las colecciones van a contener "perros" y solo "perros".
Además es más descriptivo a la hora de leer el código. Si otro programador tiene que leer el código escrito por nosotros, enseguida va a saber que tipo de dato van a contener nuestros ArrayLists.



Dicho esto, para adaptar el código que puse a tu clase, basta con apenas un par de cambios.
El método que necesitas podría quedar así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public String darRazaMasPopular() {
 
    	String razaActual = "", razaMayor = "";
		int contActual = 0, contMayor = 0;
 
		for (int i = 0; i < perros.size(); i++) {
			if (razaActual.equals(perros.get(i).darRaza())) { //Misma raza que la actual
				contActual++; //Incrementamos contador
			}
			else { //Nueva raza encontrada.
				//Comprobamos si la raza anterior, es (por ahora) la mas popular
				if (contActual > contMayor) { //Sí lo es
					contMayor = contActual; //Memorizamos el contador mayor
					razaMayor = razaActual; //y la raza mayor (mas popular de momento)
				}
				//Tras comprobar, comenzamos a evaluar la nueva raza actual
				contActual = 1; //Inicializamos contador
				razaActual = perros.get(i).darRaza(); //Memorizamos razaActual
			}
		}
 
		return razaMayor;
    }

He escrito un pequeño "main" de prueba donde agrego unos pocos perros:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Prueba {
 
	public static void main(String[] args) {
 
		ExposicionPerros expo = new ExposicionPerros();
		expo.agregarPerro("Nevado", "Samoyedo", "", 2, 3);
		expo.agregarPerro("Nanuk", "Samoyedo", "", 2, 3);
		expo.agregarPerro("Draco", "Pitbull", "", 2, 3);
		expo.agregarPerro("Ursus", "Pitbull", "", 1, 3);
		expo.agregarPerro("Bolita", "Caniche", "", 3, 2);
		expo.agregarPerro("Conan", "Pitbull", "", 2, 4);
 
		expo.ordenarPorRaza();
		String razaPopular = expo.darRazaMasPopular();
 
		System.out.println("Raza mas popular: " + razaPopular);
 
	}
 
}

Y al ejecutar, detecta la raza más popular, así que parece que funciona bien:
1
Raza mas popular: Pitbull

Cualquier pregunta, publícala aquí.

Un saludo.
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

Contador Java

Publicado por sergio (3 intervenciones) el 02/03/2023 02:18:51
Muchas gracias por tu apoyo

Tomare en cuenta lo de colocar entre llaves el tipo de dato/clase que van a contener.

Saludos
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