1+ /**
2+ * TEORÍA: Conjuntos (Sets) en TypeScript
3+ *
4+ * TypeScript utiliza la misma implementación de Set que JavaScript, pero añade
5+ * tipado estático y algunas mejoras en la sintaxis. Los Sets en TypeScript:
6+ *
7+ * 1. Son colecciones de valores únicos
8+ * 2. Pueden contener cualquier tipo de valor
9+ * 3. Mantienen el orden de inserción
10+ * 4. Proporcionan operaciones eficientes para añadir, eliminar y verificar elementos
11+ *
12+ * TypeScript añade la capacidad de tipar los Sets, por ejemplo:
13+ * let stringSet: Set<string> = new Set<string>();
14+ */
15+
16+ class SetOperations < T > {
17+ private conjunto : Set < T > ;
18+
19+ constructor ( ) {
20+ this . conjunto = new Set < T > ( ) ;
21+ }
22+
23+ /**
24+ * Muestra el contenido actual del conjunto
25+ */
26+ private mostrarConjunto ( mensaje : string ) : void {
27+ console . log ( `${ mensaje } : [${ Array . from ( this . conjunto ) . join ( ", " ) } ]` ) ;
28+ }
29+
30+ /**
31+ * 1. Añade un elemento al final
32+ */
33+ agregarAlFinal ( elemento : T ) : void {
34+ this . conjunto . add ( elemento ) ;
35+ this . mostrarConjunto ( `Después de añadir '${ String ( elemento ) } ' al final` ) ;
36+ }
37+
38+ /**
39+ * 2. Añade un elemento al "principio"
40+ * Nota: En realidad, en un Set no hay concepto de principio o final
41+ * Simulamos esto convirtiendo a array, modificando y volviendo a Set
42+ */
43+ agregarAlPrincipio ( elemento : T ) : void {
44+ const tempArray = Array . from ( this . conjunto ) ;
45+ this . conjunto = new Set ( [ elemento , ...tempArray ] ) ;
46+ this . mostrarConjunto ( `Después de añadir '${ String ( elemento ) } ' al principio` ) ;
47+ }
48+
49+ /**
50+ * 3. Añade varios elementos en bloque al final
51+ */
52+ agregarVariosAlFinal ( elementos : T [ ] ) : void {
53+ elementos . forEach ( elemento => this . conjunto . add ( elemento ) ) ;
54+ this . mostrarConjunto ( "Después de añadir varios elementos al final" ) ;
55+ }
56+
57+ /**
58+ * 4. Añade varios elementos en bloque en una posición concreta
59+ */
60+ agregarVariosEnPosicion ( elementos : T [ ] , posicion : number ) : void {
61+ const tempArray = Array . from ( this . conjunto ) ;
62+ tempArray . splice ( posicion , 0 , ...elementos ) ;
63+ this . conjunto = new Set ( tempArray ) ;
64+ this . mostrarConjunto ( `Después de añadir elementos en posición ${ posicion } ` ) ;
65+ }
66+
67+ /**
68+ * 5. Elimina un elemento en una posición concreta
69+ */
70+ eliminarEnPosicion ( posicion : number ) : void {
71+ const tempArray = Array . from ( this . conjunto ) ;
72+ if ( posicion >= 0 && posicion < tempArray . length ) {
73+ tempArray . splice ( posicion , 1 ) ;
74+ this . conjunto = new Set ( tempArray ) ;
75+ this . mostrarConjunto ( `Después de eliminar elemento en posición ${ posicion } ` ) ;
76+ }
77+ }
78+
79+ /**
80+ * 6. Actualiza el valor de un elemento en una posición concreta
81+ */
82+ actualizarEnPosicion ( posicion : number , nuevoValor : T ) : void {
83+ const tempArray = Array . from ( this . conjunto ) ;
84+ if ( posicion >= 0 && posicion < tempArray . length ) {
85+ tempArray [ posicion ] = nuevoValor ;
86+ this . conjunto = new Set ( tempArray ) ;
87+ this . mostrarConjunto ( `Después de actualizar elemento en posición ${ posicion } ` ) ;
88+ }
89+ }
90+
91+ /**
92+ * 7. Comprueba si un elemento está en el conjunto
93+ */
94+ contiene ( elemento : T ) : boolean {
95+ const resultado = this . conjunto . has ( elemento ) ;
96+ console . log ( `¿El conjunto contiene '${ String ( elemento ) } '? ${ resultado ? "Sí" : "No" } ` ) ;
97+ return resultado ;
98+ }
99+
100+ /**
101+ * 8. Elimina todo el contenido del conjunto
102+ */
103+ limpiar ( ) : void {
104+ this . conjunto . clear ( ) ;
105+ this . mostrarConjunto ( "Después de limpiar el conjunto" ) ;
106+ }
107+
108+ /**
109+ * Obtiene el conjunto actual
110+ */
111+ obtenerConjunto ( ) : Set < T > {
112+ return this . conjunto ;
113+ }
114+ }
115+
116+ /**
117+ * Clase estática para operaciones extra con conjuntos
118+ */
119+ class OperacionesExtra {
120+ /**
121+ * Unión de dos conjuntos
122+ */
123+ static union < T > ( conjunto1 : Set < T > , conjunto2 : Set < T > ) : Set < T > {
124+ return new Set ( [ ...conjunto1 , ...conjunto2 ] ) ;
125+ }
126+
127+ /**
128+ * Intersección de dos conjuntos
129+ */
130+ static interseccion < T > ( conjunto1 : Set < T > , conjunto2 : Set < T > ) : Set < T > {
131+ return new Set ( [ ...conjunto1 ] . filter ( x => conjunto2 . has ( x ) ) ) ;
132+ }
133+
134+ /**
135+ * Diferencia de dos conjuntos
136+ */
137+ static diferencia < T > ( conjunto1 : Set < T > , conjunto2 : Set < T > ) : Set < T > {
138+ return new Set ( [ ...conjunto1 ] . filter ( x => ! conjunto2 . has ( x ) ) ) ;
139+ }
140+
141+ /**
142+ * Diferencia simétrica de dos conjuntos
143+ */
144+ static diferenciaSimetrica < T > ( conjunto1 : Set < T > , conjunto2 : Set < T > ) : Set < T > {
145+ const diferencia1 = OperacionesExtra . diferencia ( conjunto1 , conjunto2 ) ;
146+ const diferencia2 = OperacionesExtra . diferencia ( conjunto2 , conjunto1 ) ;
147+ return OperacionesExtra . union ( diferencia1 , diferencia2 ) ;
148+ }
149+ }
150+
151+ // Función para mostrar un conjunto
152+ function mostrarConjunto < T > ( nombre : string , conjunto : Set < T > ) : void {
153+ console . log ( `${ nombre } : [${ Array . from ( conjunto ) . join ( ", " ) } ]` ) ;
154+ }
155+
156+ // Demostración de uso
157+ function demostrarOperaciones ( ) : void {
158+ console . log ( "PARTE 1: OPERACIONES BÁSICAS" ) ;
159+ const demo = new SetOperations < string > ( ) ;
160+
161+ demo . agregarAlFinal ( "Elemento1" ) ;
162+ demo . agregarAlPrincipio ( "Elemento2" ) ;
163+ demo . agregarVariosAlFinal ( [ "Elemento3" , "Elemento4" , "Elemento5" ] ) ;
164+ demo . agregarVariosEnPosicion ( [ "ElementoA" , "ElementoB" ] , 2 ) ;
165+ demo . eliminarEnPosicion ( 3 ) ;
166+ demo . actualizarEnPosicion ( 1 , "ElementoActualizado" ) ;
167+ demo . contiene ( "Elemento1" ) ;
168+ demo . limpiar ( ) ;
169+
170+ console . log ( "\nPARTE 2: OPERACIONES EXTRA" ) ;
171+ const conjunto1 = new Set ( [ 1 , 2 , 3 , 4 , 5 ] ) ;
172+ const conjunto2 = new Set ( [ 4 , 5 , 6 , 7 , 8 ] ) ;
173+
174+ mostrarConjunto ( "Conjunto 1" , conjunto1 ) ;
175+ mostrarConjunto ( "Conjunto 2" , conjunto2 ) ;
176+
177+ const union = OperacionesExtra . union ( conjunto1 , conjunto2 ) ;
178+ mostrarConjunto ( "Unión" , union ) ;
179+
180+ const interseccion = OperacionesExtra . interseccion ( conjunto1 , conjunto2 ) ;
181+ mostrarConjunto ( "Intersección" , interseccion ) ;
182+
183+ const diferencia = OperacionesExtra . diferencia ( conjunto1 , conjunto2 ) ;
184+ mostrarConjunto ( "Diferencia (conjunto1 - conjunto2)" , diferencia ) ;
185+
186+ const diferenciaSimetrica = OperacionesExtra . diferenciaSimetrica ( conjunto1 , conjunto2 ) ;
187+ mostrarConjunto ( "Diferencia simétrica" , diferenciaSimetrica ) ;
188+ }
189+
190+ // Ejecutar la demostración
191+ demostrarOperaciones ( ) ;
0 commit comments