Ejercicio de array mínimos y máximos (java).

B

Hola, estoy tratando de hacer un programa en java que me diga cuál es el número máximo de dentro del array, y el número mínimo, y cuántas veces se repite cada uno, pero me da fallos, he probado a debugar pero no logro ver donde está el fallo, porque a veces el programa va, y otras veces no.

PD. No pido que me deis el código hecho, simplemente intentad ayudarme de alguna manera para ver si yo mismo puedo ver el fallo y arreglarlo.

Esto es lo que he hecho:


	int array[] = new int [5];
	int valorMax = 0;
	int contadorMaximos = 0;
	int valorMin = 0;
	int contadorMinimos = 0;

	System.out.println("Array: ");

	for (int i = 0; i < array.length; i++) {

		array[i] = (int) (Math.random()*100)+1;

		System.out.print(array[i] + "//");

		if (valorMax < array[i]) {
			valorMax = array[i];
			contadorMaximos++;
		}
		
		valorMin = array[0];
		
		if (valorMin > array[i]) {
			valorMin=array[i];
			contadorMinimos++;
		}

	}

	System.out.println("");
	System.out.println("El valor maximo es " + valorMax + " y se ha repetido " + contadorMaximos + " veces.");
	System.out.println("El valor minimo es " + valorMin + " y se ha repetido " + contadorMinimos + " veces.");
}
}



HeXaN

Ponte en un papel los cinco o seis números antes de fallar y sigue línea a línea cada instrucción de tu código.

1 2 respuestas
Devilpower

Puedes empezar por decir que fallos te da xD

bothar

valorMin = array[0];
esa linea te sobra, si por ejemplo te sale 3, -1, 2, gracias a esa linea, tendrás que valorMin = 2, y no -1, como deberías.
Además, si pones valor max a 0, que pasaría si te salieran los números -1, -3, -3? Valor max seria 0, pero seria incorrecto.
El contadorMaximos y contadorMinimos, no entiendo si calculan lo que quieres calcular, lo que tienes ahí lo que hace es contarte por cuantos valores máximos y cuantos valores mínimos diferentes pasa, es decir: si te sale 3, 2, 1, valorMaximo sera 3 y contadorMaximos sera uno, pero si te sale 1,2,3, valorMaximo sera 3 y contadorMaximos sera 3 también

1 respuesta
cabron

La lógica que has hecho no tiene sentido, no puedes aumentar el contador cada vez que encuentras un número mayor que otro, por que eso no te da el número de veces que se repite el número más alta, te da el número de veces que ha aparecido un número mayor que otro... y lo mismo para el mínimo

1 2 respuestas
Devilpower

#4 Nunca pueden salir numeros menores que 0, esta usando Math.random() para rellenar el array.

Coincido con #5 cada vez que te salga un numero menor, no tienes que incrementar, tienes que resetearlo a uno, y cada vez que un numero sea igual a dicho numero menor, incrementar.

Lo mismo para el numero mayor.

FrUcTuS

#1
Pista 1 .- Para saber cual es el mayor numero que hay dentro del array tienes que recorrer si o si el array al completo. El numero maximo sera el que sea > que cualquier otro indice[ i ] del array.

Pista 2.- Una vez tengas identificado el numero maximo, recorriendo el array de nuevo podras saber cuantas veces se repite.

PD: Bubble Sort o Ordenacion por Burbuja es un algoritmo que ordena un array de enteros. Si lo haces, tu numero mayor... sera el ultimo indice en caso de ordenarlos de menor a mayor...

PD2: La clase Arrays contenida en el paqueta java.util... tiene un metodo llamado sort()... para primitivos y String (si mal no recuerdo).

PD3: Haz lo que dice #2 ... te ayudara a comprender porque tu codigo no tiene sentido.

1 respuesta
GaaRa90

Como dicen por ahi arriba, lo mas importante es el orden de las cosas...de echo creo que cuando llegas a tener experiencia te das cuenta que lo mas importante es desglosar adecuadamente los los requerimientos/necesidades en cada situacion y ahi vendra el buen desglose del programa.

Hay ciertas lineas de tu codigo que no tienen sentido ninguno y algo sabes pero no sabes bien lo que haces.
Lo que mejor les va a mis alumnos es comparar las cosas con cosas cotidianas.

Array=Parking del coche: Tu tienes un parking y te preguntan... dime las medidas de las ruedas del coche mas pequeño, tu tendras que ir UNO a UNO comprobando las medidas de las ruedas y en cada medicion compararas la medida mas pequeña que tengas con la que vas a medir.

Esto es para que comprendas como funcionan los arrays ya que los arrays van ligados a los iteradores ( bucles ).

spoiler
2 respuestas
Lucky7s

#7 Si bien serían soluciones válidas, no hay ninguna necesidad ni de recorrer el array dos veces ni de ordenarlo. Esto último es especialmente grave al pasar a otra categoría de complejidad (de lineal a nlogn). Peor todavía si escoge Bubble Sort, con complejidad todavía mayor (n2 en peor caso e incluso en promedio).

Como indican #5 y #6, el problema es que incrementar el contador cuando encuentras un nuevo máximo/mínimo no tiene sentido. En ese caso lo que toca es ponerlo a 1, y la condición para incrementarlo es otra (respuesta más adelante). Tampoco tiene sentido valorMin = array[0] incondicionalmente en cada iteración. Te estás cargando lo que tuvieras guardado.

#8 Las comparaciones son correctas, aunque a mi gusto se entenderían mejor al revés.
if (valorMax < array[i]) es lo mismo que if (array[i] > valorMax), y entonces es correcto valorMax = array[i], porque hemos encontrado un número más grande que el que tenemos como máximo hasta ahora. Lo mismo para el mínimo.

Respuesta sin código
B

Yo inicializaría primero con números aleatorios y luego haría la faena, pero bueno, si hay que hacerlo por huevos en un solo for...

Para empezar, como ya te han comentado, estás contando la cantidad de repeticiones que tiene el mayor y menor número dentro de los ifs para encontrar los mayores y menores. Antes de buscar mayor o menor, compara, pregúntate si el número es igual que el que estás comparando. Luego está el asunto de cargarte el número de valorMin con cada recorrido del bucle.

Tal como te dice #2 , pilla tu código y móntate un ejemplo con números que quieras (así puedes poner repes y demás), sigue línea por línea lo que haría y si te da el resultado que quieres.

spoiler
afhn

Lo que te habrán dicho ya, lo suyo es almacenar en cada pasada el nuevo número aleatorio en una variable de comparación para comparar mayor que y menor que, si da positivo contra las variables que tienes de mayor que y menor que de la anterior pasada, entran en la condición y se almacenan, lo que toque. Después para mirar la igualdad habría que pasar otro for o un while dentro del for por cada pasada y buscar coincidencias, si coincide pues un ++.
En tu código te sobra así a voz de pronto los contadores y el

valorMin = array[0];

puesto que en cada pasada estás sobrescribiendo la variable de valorMin con la posición del array, yo añadiría un "||" en el if de valorMin con un valorMin==0 o un if else, porque si digamos que en la posición 0 del Array tienes un 30, el variable de valorMin siempre va a ser 30 por ende, si la posición anterior era 20, y la siguiente es 21, al sobrescribir se pierde el 20 y la comparación es con 30 cogiéndote como min 21 al ser una comparación de 30vs21 y no 20vs21.

1 respuesta
B

#11 No veo mal procesar primero el número que vayamos a meter en la array y luego meterlo, pero quizás un bucle aninado para un ejercicio como este es overkill, además lo que se busca es encontrar los que se repiten tanto del número máximo como el mínimo, no si existen repetidos de cualquier número que haya en el array.

1 respuesta
Ranthas

Arrays.AsList().stream().mapToInt().max()/.min()

2 respuestas
afhn

#12 ups, my bad, las horas afectan mi comprensión lectora, aunque es igual, se podría extrapolar en plan cuando vaya a almacenar el nuevo número mayor que busque si ha habido un número igual en el array con otro bucle al igual que con el otro antes de almacenar el nuevo número. De todos modos, seguramente haya alguna función en plan .find(x) sin necesidad de hacer array anidados.

B

Gracias a todos por la ayuda, seguramente sea mejorable el código y sea pueda optimizar por todas partes, pero al final lo he conseguido resolver.

#8

#8GaaRa90:

Esto es para que comprendas como funcionan los arrays ya que los arrays van ligados a los iteradores ( bucles ).

Esa frase me ha servido mucho, gracias.

#13 Piensa que estoy comenzando a programar, todo eso que has puesto me suena a chino.

Así me ha quedado el código.

spoiler
1 respuesta
Lecherito

#13 IntStream.of(array).max()/.min()

1
GaaRa90

#15 de nada, en terminos de eficiancia tu codigo aun se podria optimizar mas XDD

en una misma pasada de un iterador puedes comprobar tanto el minimo como el maximo, por lo que en total tendrias que tener tres bucles.
1º bucle, rellanar
2º bucle, sacar maximo y minimo
3º bucle contar cuantos maximos y minimos hay.

PD: las variables que utilizas como "booleanos" dentro de los fors no tiene por que ser distintas, de echo, esas variables son un tanto especiales dado que tras pasar la ultima linea del for y salirte de este, esa variable es como si no existiera, te lo digo por el bucle del FOR con J.

JuAn4k4

No hace falta recorrerlo de nuevo para saber las veces que se repite.

si es menor que el min -> nuevo minimo, contadorMin=1
si es igual al minimo -> contadorMin++

si es mayor que el max -> nuevo maximo, contadorMin = 1
si es igual al maximo -> contadorMax++

Una pista, si inicializas tu valor minimo a 0 y no pueden salir numeros menores a 0 en tus randoms. Que puede pasar ?

Antes de sentarte y picar codigo te recomiendo que hagas lo siguiente:

Coje una baraja de cartas, pillas 10 cartas al azar (boca abajo)
Las cojes una a una (la pones boca arriba, la miras, y la pones boca abajo en otro monton diferente), las recorres una a una.
Y cuando acabes, dices cual es la mayor, la menor, y cuantas veces se repite el numero menor y mayor.
Puedes apuntar en un papel las variables.
Y despues vas, y lo programas.

Programar directamente puede ser complicado al principio.

Y mi consejo es: No lo dejes cuando simplemente funcione, crea unos tests para tu programa (piensa los casos que se te ocurran)
Por ejemplo:
array = [3,4,5, 3]
minimo tiene que ser 3
maximo tiene que ser 5
contador minimo 2
contador maximo 1

Te creas varios casos asi, y compruebas que funcione en todos tus casos.

Y despues, cuando los tests funcionen, lo refactorizas, y lo dejas limpio. Es como hacer la comida y dejar la cocina de mierda hasta arriba

Usuarios habituales