package com.trifulcas.colecciones; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; public class UsosHashMap { public static void main(String[] args) { ArrayList<String> usuarios=new ArrayList<>(); Collections.addAll(usuarios, "Ana","Eva","Juan","Rosa","Pep","Sara"); System.out.println(generaClaves(usuarios)); HashMap<String,ArrayList<Integer>> hash02=new HashMap<>(); hash02.put("Ana", new ArrayList<>()); hash02.get("Ana").add(5); hash02.get("Ana").add(7); hash02.get("Ana").add(9); hash02.put("Eva", new ArrayList<>()); hash02.get("Eva").add(6); hash02.get("Eva").add(8); hash02.get("Eva").add(10); System.out.println(getMedias(hash02)); } // Una función a la que le pasamos un arraylist de nombres y nos genera // Un diccionario con la clave el nombre y un valor que será una contraseña // basada en el nombre, la primera letra del nombre, el índice del arraylist // y la última letra del nombre // generaClaves(ArrayList) static HashMap<String,String> generaClaves(ArrayList<String> usuarios){ HashMap<String,String> res=new HashMap<String,String>(); for (int i=0;i<usuarios.size();i++) { String usuario=usuarios.get(i); String password=usuario.substring(0,1)+i+usuario.substring(usuario.length()-1); res.put(usuarios.get(i), password); } return res; } // Una función a la que le pasamos un diccionario con el nombre de un alumno // Y el valor un arraylist de notas y nos devuelve el hashmap con las medias static HashMap<String,Double> getMedias(HashMap<String,ArrayList<Integer>> notas){ HashMap<String,Double> res=new HashMap<String,Double>(); for(String alumno:notas.keySet()) { double suma=0; for(int nota: notas.get(alumno)) { suma+=nota; } res.put(alumno, suma/notas.get(alumno).size()); } return res; } }
Autor: Juan Pablo Fuentes
Formador de programación y bases de datos
Ejemplos HashMap
package com.trifulcas.colecciones; import java.util.ArrayList; import java.util.HashMap; import java.util.Map.Entry; public class EjemplosHashMap { public static void main(String[] args) { // Creo un hashmap de clave cadena y valor integer HashMap<String, Integer> diccionario = new HashMap<String, Integer>(); // Añado valores diccionario.put("Ana", 7); diccionario.put("Eva", 8); diccionario.put("Rosa", 6); // Recupero valores System.out.println(diccionario.get("Ana")); System.out.println(diccionario.get("Pep")); // Compruebo si existe una clave (en este caso no) System.out.println(diccionario.containsKey("Pep")); // Recorro las claves for (String clave : diccionario.keySet()) { // COn la clave tengo el valor vía get System.out.println(clave + " - " + diccionario.get(clave)); } // Recorro solo los valores for (Integer valor : diccionario.values()) { System.out.println(valor); } // Recorro el par clave valor con entryset for (Entry<String, Integer> entrada : diccionario.entrySet()) { System.out.println(entrada.getKey()+" - "+entrada.getValue()); } // Eliminar elementos diccionario.remove("Rosa"); System.out.println(diccionario); // Cambio un valor diccionario.put("Ana",9); System.out.println(diccionario); // Borro todo el hasmap diccionario.clear(); System.out.println(diccionario); // Yo puedo hacer hashmap de cualquier cosa HashMap<Integer,String> hash01=new HashMap<>(); hash01.put(27, "Hola"); hash01.put(19, "Adios"); System.out.println(hash01); // Un hashmap que tiene como valores un arraylist HashMap<String,ArrayList<Integer>> hash02=new HashMap<>(); hash02.put("Ana", new ArrayList<>()); hash02.get("Ana").add(5); hash02.get("Ana").add(7); hash02.get("Ana").add(9); hash02.put("Eva", new ArrayList<>()); hash02.get("Eva").add(6); hash02.get("Eva").add(8); hash02.get("Eva").add(10); System.out.println(hash02); for(String alumno:hash02.keySet()) { System.out.println(alumno); for(int nota:hash02.get(alumno)) { System.out.println(nota); } } // El primer elemento del alumno "Ana" System.out.println(hash02.get("Ana").get(0)); } }
Soluciones ejercicios
package com.trifulcas.colecciones; import java.util.ArrayList; import java.util.LinkedList; public class SolucionesEjercicios { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(tablaMultiplicar(7)); System.out.println(menoresQue(new int[] { 1, 2, 3, 4, 5, 6 }, 4)); System.out.println(menoresQue(new String[] { "hola","que","tal","estamos" }, 4)); LinkedList<Integer> a=new LinkedList<Integer>(); a.add(1); a.add(2); a.add(3); a.add(4); LinkedList<Integer> b=new LinkedList<Integer>(); b.add(3); b.add(4); b.add(5); b.add(6); System.out.println(diferencia(a,b)); } /* * Crear una función tablaMultiplicar(numero) a la que le pasamos un número y * nos devuelve un arraylist con la tabla de multiplicar de ese número * tablaMultiplicar(5)->[5,10,15,20,25,30,35,40,45,50] */ static ArrayList<Integer> tablaMultiplicar(int numero) { ArrayList<Integer> res = new ArrayList<Integer>(); for (int i = 1; i <= 10; i++) { res.add(i * numero); } return res; } /* * Crear una función menoresQue a la que le pasamos un array de enteros y un * entero y nos devuelve un arraylist con los números menores o iguales a ese * entero menoresQue([1,2,3,4,5,6],4)->[1,2,3,4] */ static ArrayList<Integer> menoresQue(int[] lista, int limite) { ArrayList<Integer> res = new ArrayList<Integer>(); for (int numero : lista) { if (numero <= limite) { res.add(numero); } } return res; } /* * Crear una sobrecarga con String que nos devuelva las cadenas de longitud * menor o igual al entero menoresQue(["Eva","Ana","Jaimito"],4)->["Eva","Ana"] */ static ArrayList<String> menoresQue(String[] lista, int limite) { ArrayList<String> res = new ArrayList<String>(); for (String cadena : lista) { if (cadena.length() <= limite) { res.add(cadena); } } return res; } /* * Crear una función diferencia a la que le pasamos dos * linkedlist de enteros y nos devuelve un linkedlist * con los elementos del primer linkedlist que no están * en el segundo diferencia([1,2,3,4],[3,4,5,6])->[1,2] */ static LinkedList<Integer> diferencia(LinkedList<Integer> a, LinkedList<Integer> b){ LinkedList<Integer> res=new LinkedList<Integer>(); for (int numero:a) { if (!b.contains(numero)) { res.add(numero); } } return res; } }
Ejercicios preexamen
# Crear una función areaCuadrado(lado) a la que le pasamos un lado y nos devuelve el área # areaCuadrado(2)-> 4 # Crear una función a la que le pasamos un número y nos devuelve true si es divisible por # 3 y false en caso contrario # multiploTres(8)->False multiploTres(9)->True # Crear una función a la que le pasamos una lista de números y nos dice # el número de pares que hay # numeroPares([1,2,3,4])->2 # Crear una función a la que le pasamos una cadena y un carácter y nos devuelve una lista # con las palabras que tienen ese caracter # buscaCaracter("Hola que tal","a")->["hola","tal"] # buscaCaracter("Hola que tal","u")->["que"] # Crear una función a la que le pasamos una cadena y nos devuelve la lista de palabras # ordenada por longitud
Repaso funciones
# funciones # pilar básico de la programación # Nos sirve para encapsular un trozo de código # Y procuramos que las funciones sean 'puras' # los mismos parámetros de entrada devuelven los mismos resultados import math # No es una función pura porque depende del entorno (consola) def saludo(): print("hola que tal") saludo() # Función pura que devuelve un resultado def saludo(): return "hola que tal" # Puedo imprimir en la consola print(saludo()) archivo = open("saludo.txt", "w") # O en un archivo archivo.write(saludo()) archivo.close() # o crear una variable holi = saludo() def saludar(nombre): return "Hola " + nombre + " ¿que tal estás?" print(saludar("Ana")) alumnos = ["Ana", "Eva", "Pep", "Rosa"] for alumno in alumnos: print(saludar(alumno)) saludos = [saludar(alumno) for alumno in alumnos] print(saludos) def esPrimo(numero): for i in range(2, int(math.sqrt(numero))): if numero % i == 0: return False return True # divide y vencerás def listaPrimos(limite): res=[] for i in range(2,limite+1): if esPrimo(i): res.append(i) return res print(esPrimo(17)) print(esPrimo(18)) primos=listaPrimos(50) print(primos)
Repaso for y listas
# estructuras de control """ if condidicion: lo que hacemos si se cumple else: lo que hacemos si no se cumple if condicion: si se cumple elif otra condicion: si se cumple la otra else: en cualquier otro caso if a<1000: 0-1000 elif a<2000: 1000-2000 elif a<3000 2000-3000 las condiciones: tenemos operadores: not, and y or and : Se tienen que cumplir las dos or : Basta que se cumpla una de ellas if edad>=18 and dinero>20: print("Entra en la discoteca") else: Si entra por aquí puede ser porque es menor de 18, porque tiene menos de 20 o por las dos if edad>12 or altura>135: print("Sube a la atracción") Aquí entra porque es mayor de 12, su altura es> 135 o las dos else: Es <12 años y altura<135 """ lista = [1, 2, 3, 4, 5] alumnos = ["aa", "bb", "cc", "dd"] mixta = [1, "cadenas", True] # bucle for. El bucle for nos recorre una lista for numero in lista: # recorro la lista print(numero) # imprime 1,2,3,4,5 for alumno in alumnos: print(alumno) for i in range(10): print(i) numeros = range(20) print(list(numeros)) lista.append(8) # Yo tengo una lista, o cualquier otro objeto complejo (tuplas, diccionarios, conjuntos) # SI quiero procesar los elementos de la lista tendré que hacer EL ESQUEMA # una variable donde calcularé algo # recorreré la lista # modificaré el cálculo a veces dependiendo de una condición # sumar todos los números del 1 al 100 # suma=0 # recorro los numeros del 1 al 100 y los sumo suma = 0 for i in range(1, 101): suma += i print(suma) suma = 0 for i in range(1, 101): if i % 2 == 0: suma += i print(suma) pares = [] for i in range(11): if i % 2 == 0: pares.append(i) print(pares) # Comprension de listas sintaxis: #[ transformación de elemento for elemento in lista condicion de filtro ] codigos=["123","4560","7890","1234","5678"] c1=[elemento for elemento in codigos] print(codigos) print(c1) c2=[len(elemento) for elemento in codigos] print(c2) c3=[elemento[-1] for elemento in codigos] print(c3) c4=["hola" for elemento in codigos] print(c4) c5=[elemento for elemento in codigos if len(elemento)>3] print(c5) c6=[elemento for elemento in codigos if elemento[-1]=="0"] print(c6) c7=[elemento[0:2] for elemento in codigos if elemento[-1]=="0"] print(c7) res=[] for elemento in codigos: if elemento[-1] == "0": res.append(elemento[0:2]) print(res)
Ejercicios soluciones y test unitario
# Crear una función precio que nos calcule el precio de un viaje de la siguiente manera # precioViaje(tipoCliente,destino) # si el cliente es 'vip' y el destino es 'Atenas' 1000 # si el cliente es 'normal' y el destino es 'Atenas' 1300 # si el cliente es 'vip' y el destino es 'Roma' 600 # si el cliente es 'normal' y el destino es 'Roma' 900 def precioViaje(tipoCliente, destino): tabla = [{"tipo": "vip", "destinos": [{"destino": "Atenas", "precio": 1000}, {"destino": "Roma", "precio": 600}]}, {"tipo": "normal", "destinos": [{"destino": "Atenas", "precio": 1300}, {"destino": "Roma", "precio": 900}]} ] for cliente in tabla: for destinos in cliente["destinos"]: if cliente["tipo"] == tipoCliente and destinos["destino"] == destino: return destinos["precio"] return 0 def precioViaje2(tipoCliente, destino): if tipoCliente == 'vip': if destino == 'Atenas': return 1000 if destino == 'Roma': return 600 if tipoCliente == 'normal': if destino == 'Atenas': return 1300 if destino == 'Roma': return 900 return 0 # Crear una función iniciales a la que le pasamos una cadena y nos devuelve una lista # con las primeras letras de cada palabra # iniciales("hola que tal")->['h','q','t'] def iniciales01(cadena): # cogería cada palabra # apuntaría la primera letra palabras = cadena.split() # me convierte una cadena en una lista de palabras res = [] # recorrer las palabras for palabra in palabras: res.append(palabra[0]) return res def iniciales(cadena): # cogería cada palabra # apuntaría la primera letra palabras = cadena.split() # me convierte una cadena en una lista de palabras return [palabra[0] for palabra in palabras] # Crear una función menorLongitud a la que le pasamos una cadena y un numero y nos devuelve # una lista con las palabras que tengan menor longitud que ese numero # menorLongitud("hola que tal estamos. Yo estupendo",4)->['que','tal','Yo'] def menorLongitud01(cadena, numero): palabras = cadena.split() res = [] for palabra in palabras: if len(palabra) < numero: res.append(palabra) return res def menorLongitud(cadena, numero): palabras = cadena.split() return [palabra for palabra in palabras if len(palabra) < numero]
from unittest import TestCase from ejercicios_preexamen01 import precioViaje from ejercicios_preexamen01 import iniciales from ejercicios_preexamen01 import menorLongitud class Test(TestCase): def test_precio_viaje(self): precio = precioViaje('vip', 'Atenas') self.assertEqual(precio, 1000) precio = precioViaje('vip', 'Roma') self.assertEqual(precio, 600) precio = precioViaje('normal', 'Atenas') self.assertEqual(precio, 1300) precio = precioViaje('normal', 'Roma') self.assertEqual(precio, 900) def test_iniciales(self): lista = iniciales("hola que tal") self.assertListEqual(lista, ["h", "q", "t"]) lista = iniciales("yo muy bien sabes") self.assertListEqual(lista, ["y", "m", "b", "s"]) def test_menor_longitud(self): lista=menorLongitud("hola que tal estamos. Yo estupendo",4) self.assertListEqual(lista,['que','tal','Yo']) lista = menorLongitud("aa bbb ccc dddd eeeee fffff ggggggg", 5 ) self.assertListEqual(lista, ['aa', 'bbb', 'ccc','dddd'])
Más ejercicios repaso
# Crear una función precio que nos calcule el precio de un viaje de la siguiente manera # precioViaje(tipoCliente,destino) # si el cliente es 'vip' y el destino es 'Atenas' 1000 # si el cliente es 'normal' y el destino es 'Atenas' 1300 # si el cliente es 'vip' y el destino es 'Roma' 600 # si el cliente es 'normal' y el destino es 'Roma' 900 # Crear una función iniciales a la que le pasamos una cadena y nos devuelve una lista # con las primeras letras de cada palabra # iniciales("hola que tal")->['h','q','t'] # Crear una función menorLongitud a la que le pasamos una cadena y un numero y nos devuelve # u na lista con las palabras que tengan menor longitud que ese numero # menorLongitud("hola que tal estamos. Yo estupendo",4)->['que','tal','Yo']
Tratamiento de errores en Python
# Controlar los errores con try: except import math # Intenta hacer el código entre el try y el except try: edad = int(input("Dime tu edad")) print(edad / 4) # Si ha habido algún tipo de error entra en el código del except except: print("Error") print("Algo no has introducido bien") print("Ten más cuidado la próxima vez") print("adios") def division(a, b): try: return a / b except: return math.inf print(division(4, 2)) print(division(4, 0)) def obtenerNumero(): numero = 0 while (numero == 0): try: numero = int(input("Dame un número: ")) except: numero = 0 return numero print(obtenerNumero()) try: num = int(input("Ingrese un número: ")) resultado = 10 / num except ZeroDivisionError as zde: print(f"Error de división por cero: {zde}") except ValueError as ve: print(f"Error de valor no válido: {ve}") except Exception as e: print(f"Ocurrió una excepción no manejada: {e}") try: a = 9 / 0 except Exception as e: print(e)
Soluciones ejercicios
# Cread una función a la que le pasamos una cantidad y nos devuelve el PVP # siguiendo las siguientes reglas # Si el precio es <1000 No hay descuento # Está entre 1000 y <3000 5% de descuento # Es 3000 o más 10% de descuento # devuelvo el importe, no el descuento def getPVP(importe): if importe < 1000: return importe if importe >= 1000 and importe < 3000: return importe - importe * 5 / 100 # importe * 0.95 if importe >= 3000: return importe * 0.9 def getPVP2(importe): if importe < 1000: return importe elif importe < 3000: return importe - importe * 5 / 100 # importe * 0.95 else: return importe * 0.9 def getPVP3(importe): if importe < 1000: return importe if importe < 3000: return importe - importe * 5 / 100 # importe * 0.95 return importe * 0.9 print(getPVP(200)) print(getPVP(700)) print(getPVP(1000)) print(getPVP(10000)) def doble(numero): return numero * 2 print(doble(8)) # Cread una función obtenerIRPF(departamento, sueldo) que nos devuelva el % de irpf acorde a: # Si el departamento es 'marketing' 12% # Si el departamento es 'administracion' y el sueldo es <2500 12%, si es mayor 15% # Si el departamento es 'contabilidad' tiene los siguientes tramos: # hasta 3000 10% de 3000 a 5000 12% mas de 5000 15% def obtenerIRPFOld(departamento, sueldo): if departamento == 'marketing': return .12 if departamento == 'administracion' and sueldo < 2500: return .12 if departamento == 'administracion' and sueldo >= 2500: return .15 if departamento == 'contabilidad' and sueldo < 3000: return .10 if departamento == 'contabilidad' and sueldo >= 3000 and sueldo < 5000: return .12 if departamento == 'contabilidad' and sueldo >= 5000: return .15 def obtenerIRPFClean(departamento, sueldo): if departamento == 'marketing': return .12 if departamento == 'administracion': if sueldo < 2500: return .12 else: return .15 if departamento == 'contabilidad': if sueldo < 3000: return .10 elif sueldo < 5000: return .12 else: return .15 # primero va el and y después el or def obtenerIRPF(departamento, sueldo): if departamento == 'marketing' or (departamento == 'administracion' and sueldo < 2500) or (departamento == 'contabilidad' and sueldo >= 3000 and sueldo < 5000): return .12 if departamento == 'administracion' and sueldo >= 2500 or departamento == 'contabilidad' and sueldo >= 5000: return .15 if departamento == 'contabilidad' and sueldo < 3000: return .10 print(obtenerIRPF('marketing', 1000)) print(obtenerIRPF('administracion', 1000)) print(obtenerIRPF('administracion', 3000)) print(obtenerIRPF('contabilidad', 2000)) print(obtenerIRPF('contabilidad', 3500)) print(obtenerIRPF('contabilidad', 6000))