Skip to content

Commit 083da3a

Browse files
authored
Merge pull request #9019 from JimsimroDev/main
#22 - Java
2 parents 7843dbd + 688920b commit 083da3a

File tree

3 files changed

+319
-0
lines changed

3 files changed

+319
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/*
2+
* EJERCICIO:
3+
* Explora el concepto de funciones de orden superior en tu lenguaje
4+
* creando ejemplos simples (a tu elección) que muestren su funcionamiento.
5+
*
6+
* DIFICULTAD EXTRA (opcional):
7+
* Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y
8+
* lista de calificaciones), utiliza funciones de orden superior para
9+
* realizar las siguientes operaciones de procesamiento y análisis:
10+
* - Promedio calificaciones: Obtiene una lista de estudiantes por nombre
11+
* y promedio de sus calificaciones.
12+
* - Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes
13+
* que tienen calificaciones con un 9 o más de promedio.
14+
* - Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven.
15+
* - Mayor calificación: Obtiene la calificación más alta de entre todas las
16+
* de los alumnos.
17+
* - Una calificación debe estar comprendida entre 0 y 10 (admite decimales).
18+
*/
19+
20+
import java.time.LocalDate;
21+
import java.time.format.DateTimeFormatter;
22+
import java.util.Arrays;
23+
import java.util.Comparator;
24+
import java.util.List;
25+
26+
public class JimsimroDev {
27+
// Filtra por pares imprime solo los numeros pares
28+
private static List<Integer> filtrarPares(List<Integer> numeros) {
29+
var pares = numeros.stream().filter(n -> n % 2 == 0).toList();
30+
return pares;
31+
}
32+
33+
// Ordena de mayor a menor
34+
private static List<Integer> ordenardeMayorAmenor(List<Integer> numeros) {
35+
var numerosOrdenadosDescendente = numeros.stream().sorted(Comparator.reverseOrder()).toList();
36+
return numerosOrdenadosDescendente;
37+
}
38+
39+
// Multiplicar * 2
40+
private static List<Integer> multiplicarPorDos(List<Integer> numeros) {
41+
var numerosMultiplicados = numeros.stream().map(n -> n * 2).toList();
42+
return numerosMultiplicados;
43+
}
44+
45+
// Extra
46+
static class Alumno {
47+
private String nombre;
48+
private String fechaNacimiento;
49+
private List<Double> calificacion;
50+
51+
Alumno(String nombre, String fechaNacimientos, List<Double> calificacion) {
52+
this.nombre = nombre;
53+
this.fechaNacimiento = fechaNacimientos;
54+
this.calificacion = calificacion;
55+
}
56+
57+
// Inicializa la lista de esutiantes
58+
private static List<Alumno> obtenerAlumnos() {
59+
List<Alumno> estudiantes = Arrays.asList(
60+
new Alumno("Jhoan", "28/07/1995", Arrays.asList(7.7, 4.1, 3.9)),
61+
new Alumno("Juan", "05/08/1994", Arrays.asList(9.7, 9.1, 9.0)),
62+
new Alumno("Mario", "07/11/1990", Arrays.asList(8.0, 9.1, 9.9)),
63+
new Alumno("Keren", "20/12/2016", Arrays.asList(9.8, 9.9, 10.0)));
64+
return estudiantes;
65+
}
66+
67+
@Override
68+
public String toString() {
69+
return String.format("{ Nombre: %s - Fecha Nacimiento: %s }", nombre, fechaNacimiento);
70+
}
71+
}
72+
73+
static void print(Object... args) {
74+
for (Object s : args) {
75+
System.out.print(s + "\n");
76+
}
77+
}
78+
79+
// Promedio calificaciones: Obtiene una lista de estudiantes por nombre y
80+
// promedio de sus calificaciones.
81+
private static void mostrarPromedioPorAlumnos() {
82+
List<String> promedioEstudiante = Alumno.obtenerAlumnos().stream()
83+
.map(s -> {
84+
double promedio = s.calificacion.stream()
85+
.mapToDouble(d -> d).average().getAsDouble();
86+
return String.format("Nombre: %s - Fecha Nacimiento: %s - Promedio: %.2f%n ", s.nombre, s.fechaNacimiento,
87+
promedio);
88+
}).toList();
89+
print(promedioEstudiante);
90+
}
91+
92+
// Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes que
93+
// tienen calificaciones con un 9 o más de promedio.
94+
private static void getMayorPromedio() {
95+
print("Estudiantes con Promedio >= 9");
96+
print(Alumno.obtenerAlumnos().stream()
97+
.filter(s -> s.calificacion.stream()
98+
.mapToDouble(d -> d).average().getAsDouble() >= 9)
99+
.map(estudiante -> {
100+
double promedio = estudiante.calificacion.stream()
101+
.mapToDouble(d -> d).average().getAsDouble();
102+
return String.format("Nombre: %s - Promedio: %.2f%n ", estudiante.nombre, promedio);
103+
}).toList());
104+
}
105+
106+
// Obtiene una lista de estudiantes ordenada desde el más joven.
107+
private static void mostrarAlumnoPorEdadDescendente() {
108+
print("Estudiantes ordenado por fecha nacimiento");
109+
Alumno.obtenerAlumnos().stream()
110+
.sorted(Comparator
111+
.comparing((Alumno e) -> LocalDate.parse(e.fechaNacimiento, DateTimeFormatter.ofPattern("dd/MM/yyyy")))
112+
.reversed())
113+
.forEach(System.out::println);
114+
}
115+
116+
// Mayor calificación: Obtiene la calificación más alta de entre todas las de
117+
// los alumnos.
118+
private static void mostrarCalificacionMasAltaPorEstudiante() {
119+
print("La notas mas alta entre todos");
120+
Alumno.obtenerAlumnos().stream()
121+
.mapToDouble(d -> d.calificacion.stream()
122+
.mapToDouble(n -> n)
123+
.max().getAsDouble())
124+
.max().ifPresent(System.out::println);
125+
126+
}
127+
128+
// Mayor calificación: Obtiene la calificación más alta de entre todas las de
129+
// los alumnos.
130+
private static void mostrarCalificacionMasAltaGlobal() {
131+
double notaMaxima = Alumno.obtenerAlumnos().stream()
132+
.flatMapToDouble(e -> e.calificacion.stream()
133+
.mapToDouble(d -> d))
134+
.max().getAsDouble();
135+
print(notaMaxima);
136+
}
137+
138+
public static void main(String[] args) {
139+
List<Integer> listaNumeros = Arrays.asList(8, 9, 12, 1, 4, 6, 7, 11, 5, 10, 2, 3);
140+
print("Números ordenados de > a < " + ordenardeMayorAmenor(listaNumeros));
141+
print("Ordena e imprime solo los pares " + filtrarPares(ordenardeMayorAmenor(listaNumeros)));
142+
print("Multiplicar el resultado * 2 " + multiplicarPorDos(filtrarPares(ordenardeMayorAmenor(listaNumeros))));
143+
print("Numeros Impares " + listaNumeros.stream().filter(n -> n % 2 == 1).toList());
144+
print("Mayor " + listaNumeros.stream().max(Integer::compare).get());
145+
print("Menor " + listaNumeros.stream().min(Integer::compare).get());
146+
147+
// Extra
148+
mostrarPromedioPorAlumnos();
149+
getMayorPromedio();
150+
mostrarAlumnoPorEdadDescendente();
151+
mostrarCalificacionMasAltaPorEstudiante();
152+
mostrarCalificacionMasAltaGlobal();
153+
154+
List<Double> average = Alumno.obtenerAlumnos().stream()
155+
.map(estudiante -> estudiante.calificacion
156+
.stream()
157+
.mapToDouble(d -> d)
158+
.average().getAsDouble())
159+
.toList();
160+
print("Average " + average);
161+
}
162+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* EJERCICIO:
3+
* Explora el patrón de diseño "singleton" y muestra cómo crearlo
4+
* con un ejemplo genérico.
5+
*
6+
* DIFICULTAD EXTRA (opcional):
7+
* Utiliza el patrón de diseño "singleton" para representar una clase que
8+
* haga referencia a la sesión de usuario de una aplicación ficticia.
9+
* La sesión debe permitir asignar un usuario (id, username, nombre y email),
10+
* recuperar los datos del usuario y borrar los datos de la sesión.
11+
*/
12+
13+
public class JimsimroDev {
14+
15+
public static class ConfiguracionGlobal {
16+
17+
private static ConfiguracionGlobal config;
18+
19+
private ConfiguracionGlobal() {
20+
}
21+
22+
public static ConfiguracionGlobal getConfig() {
23+
return (config == null) ? config = new ConfiguracionGlobal() : config;
24+
}
25+
}
26+
27+
// Extra
28+
public static class SesionUsuario {
29+
private static SesionUsuario instancia;
30+
private Long id;
31+
private String username;
32+
private String nombre;
33+
private String email;
34+
35+
private SesionUsuario() {
36+
}
37+
38+
public static SesionUsuario getInstancia() {
39+
return instancia == null ? instancia = new SesionUsuario() : instancia;
40+
}
41+
42+
public void registrarUsuario(Long id, String username, String nombre, String email) {
43+
this.id = id;
44+
this.username = username;
45+
this.nombre = nombre;
46+
this.email = email;
47+
}
48+
49+
public String mostrarDatosUsuario() {
50+
if (this.id == null) {
51+
return "No hay usuario registrado.";
52+
}
53+
return String.format("ID: %d - Username: %s - Nombre: %s - Email: %s", this.id, this.username, this.nombre,
54+
this.email);
55+
}
56+
57+
public void cerrarSesion() {
58+
this.id = null;
59+
this.username = null;
60+
this.nombre = null;
61+
this.email = null;
62+
}
63+
}
64+
65+
public static void main(String[] args) {
66+
ConfiguracionGlobal config1 = ConfiguracionGlobal.getConfig();
67+
ConfiguracionGlobal config2 = ConfiguracionGlobal.getConfig();
68+
System.out.println(config1 == config2);
69+
70+
// Extra
71+
System.out.println("Creando una nueva instancia de SesionUsuario...");
72+
var sesion1 = SesionUsuario.getInstancia();
73+
sesion1.registrarUsuario(1L, "jimsimro", "Jim Simro", "[email protected]");
74+
75+
var sesion2 = SesionUsuario.getInstancia();
76+
77+
System.out.println(sesion2.mostrarDatosUsuario());
78+
System.out.println(sesion1.mostrarDatosUsuario());
79+
80+
System.out.println("Creando una nueva instancia de SesionUsuario...");
81+
sesion2.registrarUsuario(2L, "jhoans", "Jhoan", "[email protected]");
82+
System.out.println(sesion2.mostrarDatosUsuario());
83+
System.out.println(sesion1.mostrarDatosUsuario());
84+
85+
System.out.println("Creando una nueva instancia de SesionUsuario...");
86+
var sesion3 = SesionUsuario.getInstancia();
87+
System.out.println(sesion3.mostrarDatosUsuario());
88+
System.out.println(sesion2.mostrarDatosUsuario());
89+
System.out.println(sesion1.mostrarDatosUsuario());
90+
91+
sesion2.cerrarSesion();
92+
93+
System.out.println(sesion2.mostrarDatosUsuario());
94+
System.out.println(sesion1.mostrarDatosUsuario());
95+
}
96+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* EJERCICIO:
3+
* Explora el concepto de "decorador" y muestra cómo crearlo
4+
* con un ejemplo genérico.
5+
*
6+
* DIFICULTAD EXTRA (opcional):
7+
* Crea un decorador que sea capaz de contabilizar cuántas veces
8+
* se ha llamado a una función y aplícalo a una función de tu elección.
9+
*/
10+
public class JimsimroDev {
11+
public static interface EncenderAutomovil {
12+
void encender(String mensaje);
13+
}
14+
15+
// Clase concreta que implementa la interfaz
16+
public static class Automovil implements EncenderAutomovil {
17+
@Override
18+
public void encender(String mensaje) {
19+
System.out.println("El automóvil se ha encendido: " + mensaje);
20+
}
21+
22+
}
23+
24+
public static class DecoradorAutomovil implements EncenderAutomovil {
25+
private EncenderAutomovil wrappee;
26+
private String nombreMetodo;
27+
private int contadorLlamadas = 0;
28+
29+
private DecoradorAutomovil(EncenderAutomovil wrappee, String nombreMetodo) {
30+
this.wrappee = wrappee;
31+
this.nombreMetodo = nombreMetodo;
32+
}
33+
34+
@Override
35+
public void encender(String mensaje) {
36+
contadorLlamadas++;
37+
System.out.printf("función %s ha sido llamda %d veces \n", nombreMetodo, getContadorLlamadas());
38+
wrappee.encender(mensaje);
39+
}
40+
41+
public int getContadorLlamadas() {
42+
return contadorLlamadas;
43+
}
44+
}
45+
46+
public static void main(String[] args) {
47+
var automóvilPrueba = new Automovil();
48+
var testlaModelY = new DecoradorAutomovil(automóvilPrueba, "testlaModelY");
49+
var testlaModelS = new DecoradorAutomovil(automóvilPrueba, "testlaModelS");
50+
51+
testlaModelY.encender("Arrancando el motor V8");
52+
testlaModelY.encender("Arrancando el motor V8");
53+
testlaModelY.encender("Arrancando el motor V8");
54+
55+
testlaModelS.encender("Arrancando el motor V6");
56+
testlaModelS.encender("Arrancando el motor V6");
57+
testlaModelS.encender("Arrancando el motor V6");
58+
59+
testlaModelY.encender("Arrancando el motor V8");
60+
}
61+
}

0 commit comments

Comments
 (0)