elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  De una cadena, quitar la subcadena especificada, tantas veces como se repita.
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: De una cadena, quitar la subcadena especificada, tantas veces como se repita.  (Leído 183 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
De una cadena, quitar la subcadena especificada, tantas veces como se repita.
« en: 20 Diciembre 2024, 05:52 am »

Por ejemplo de la cadena "121213121", quitar toda subcadena "121". No es un ejemplo cualquiera, intento mostrar que hay 2 interpretaciones:

A: Quitamos el 1er 121: 121213121
Siguiente: 213121
Resultado final: 213

B: Debemos quitar:
esto: 121213121
y esto: 121213121
O sea: 121213121
Resultado final: 3

Hice algo parecido a esto, sólo sirve si la subcadena tiene 1 solo caracter (y en tal caso no hay ambiguedad):
Código
  1. Cadena = "121213121";
  2. CaracteraQuitar = "1";
  3. // Cadena a la que se agregarán los caracteres que no deban quitarse:
  4. NuevaCadena = "";
  5. PunteroDeCaracteres = -1;
  6. do {
  7. PunteroDeCaracteres++;
  8. CaracterSeñalado = Cadena.charat(PunteroDeCaracteres);
  9. // Si el caracter señalado no es como CaracteraQuitar:
  10. if (CaracterSeñalado != CaracteraQuitar) {
  11. // Agregarlo a NuevaCadena:
  12. NuevaCadena = NuevaCadena+CaracterSeñalado;
  13. }
  14. } while (PunteroDeCaracteres<Cadena.length);
  15. trace(NuevaCadena);

Intenté que elimine subcadenas de cualquier extensión, usando un método que me enseñaron, pero me tranqué:
Código
  1. Cadena = "121213121";
  2. CaracteraQuitar = "121";
  3. // Ver si el CaracteraQuitar está en Cadena:
  4. // Esto es porque en este lenguaje...
  5. // no se puede quitar un caracter de modo simple:
  6. // De Cadena se quitará...
  7. // cada presencia del CaracteraQuitar:
  8. NuevaCadena = Cadena;
  9. do {
  10. SeQuitoCaracter = "No";
  11. SaveDeNuevaCadena = NuevaCadena;
  12. // Obtener la cadena anterior a la presencia...
  13. // del CaracteraQuitar, si es que él está presente
  14. // (queda un array, join("") es para que se...
  15. // transforme en un string sin separaciones):
  16. NuevaCadena = NuevaCadena.split(CaracteraQuitar).join("");
  17. // Obtener el resto de la cadena:

¿Se puede hacer A con este método o no? ¿y B?

Acabo de probarlo sin el do y al parecer sólo funciona si CaracteraQuitar es 1 caracter. El nombre debería ser SubcadenaaQuitar, pero es otro tema.

¿Debería intentarlo ajustando mi 1er código o hay una manera mejor?


« Última modificación: 20 Diciembre 2024, 05:54 am por Tachikomaia » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.176



Ver Perfil
Re: De una cadena, quitar la subcadena especificada, tantas veces como se repita.
« Respuesta #1 en: Hoy a las 15:51 »

En ambos casos no puedes usar split() porque este solo funciona con un caracter, debes crear tu propia función, por ejemplo para A lo tienes solucionado con:

Código
  1. Cadena = "121213121"
  2. CaracteraQuitar = "121"
  3.  
  4. trace(quitarOcurrencias(Cadena, CaracteraQuitar))
  5.  
  6. function quitarOcurrencias(cadena, quitar) {
  7.  for (i = cadena.indexOf(quitar); i >= 0; i = cadena.indexOf(quitar)) {
  8.    cadena = cadena.substring(0, i) + cadena.substring(i + quitar.length)
  9.  }
  10.  return cadena
  11. }
  12.  
  13. // Devuelve: 213

- He utilizado un FOR porque las instrucciones son sencillas (un FOR es un "WHILE sencillo"), recuerda la estructura de un FOR:

for (inicialización de variables; condición para continuar, actualización de variables) {
  código
}


- Su equivalente en WHILE sería:

inicialización de variables
while (condición para continuar) {
  código
  actualización de variables
}


- El objetivo del FOR sería ahorrarse una par de líneas sencillas, aunque pueden ser más pero ya complicarían más la legibilidad del FOR

- Pero si lo quieres en WHILE completamente equivalente, porque he leído que no te gustan los FOR sería:

Código
  1. Cadena = "121213121"
  2. CaracteraQuitar = "121"
  3.  
  4. trace(quitarOcurrencias(Cadena, CaracteraQuitar))
  5.  
  6. function quitarOcurrencias(cadena, quitar) {
  7.  i = cadena.indexOf(quitar)
  8.  while (i >= 0) {
  9.    cadena = cadena.substring(0, i) + cadena.substring(i + quitar.length)
  10.    i = cadena.indexOf(quitar)
  11.  }
  12.  return cadena
  13. }
  14.  
  15. // Devuelve: 213

- indexOf busca una subcadena en una cadena, si la encuentra devuelve el índice de donde empieza la subcadena, devuelve -1 si no encuentra nada, hace la búsqueda de izquierda a derecha y solo hace una vez, por eso lo pongo en un bucle

En caso de B no puedes quitar mientras buscas, para ese caso debes marcar los caracteres a quitar y al final quitarlos

Código
  1. Cadena = "121213121";
  2. CaracteraQuitar = "121";
  3.  
  4. trace(quitarOcurrencias2(Cadena, CaracteraQuitar))
  5.  
  6. function quitarOcurrencias2(cadena, quitar) {
  7.  
  8.  i = 0
  9.  idx = cadena.indexOf(quitar, i)
  10.  if (idx < 0) return cadena //Si no hay ocurrencias salgo de inmediato
  11.  
  12.  for (marcas = []; idx >= 0; i = idx + 1, idx = cadena.indexOf(quitar, i)) {
  13.    for (j = 0; j < quitar.length; j++) {
  14.      marcas[idx + j] = true
  15.    }
  16.  }
  17.  
  18.  nuevaCadena = ""
  19.  for (i = 0; i < cadena.length; i++) {
  20.    if (marcas[i] != true) {
  21.      nuevaCadena += cadena.charAt(i)
  22.    }
  23.  }
  24.  
  25.  return nuevaCadena
  26. }
  27.  
  28. // Devuelve: 3

Para este caso igualmente utilizo indexOf pero le doy un parámetro extra que es el índice de caracter donde debe empezar a buscar la subcadena en la cadena, tengo un array para guardar las marcas de acuerdo a la posición de los caracteres, marco con true los caracteres que coinciden. Al final reviso los caracteres marcados y solo conservo los que no tienen marca

He usado FOR y como vez se complica un poquitín más y podría no ser muy legible XD, acá te dejo el equivalente con WHILE

Código
  1. Cadena = "121213121";
  2. CaracteraQuitar = "121";
  3.  
  4. trace(quitarOcurrencias2(Cadena, CaracteraQuitar))
  5.  
  6. function quitarOcurrencias2(cadena, quitar) {
  7.  
  8.  i = 0
  9.  idx = cadena.indexOf(quitar, i)
  10.  if (idx < 0) return cadena //Si no hay ocurrencias salgo de inmediato
  11.  
  12.  marcas = []
  13.  while (idx >=0) {
  14.    for (j = 0; j < quitar.length; j++) {
  15.      marcas[idx + j] = true
  16.    }
  17.    i = idx + 1
  18.    idx = cadena.indexOf(quitar, i)
  19.  }
  20.  
  21.  nuevaCadena = ""
  22.  for (i = 0; i < cadena.length; i++) {
  23.    if (marcas[i] != true) {
  24.      nuevaCadena += cadena.charAt(i)
  25.    }
  26.  }
  27.  
  28.  return nuevaCadena
  29. }
  30.  
  31. // Devuelve: 3


« Última modificación: Hoy a las 18:07 por EdePC » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
una subcadena dentro de una cadena
Programación Visual Basic
minette1988 2 6,476 Último mensaje 24 Mayo 2010, 16:31 pm
por Dessa
[C] Contar subcadena en una cadena
Programación C/C++
_*p 0 4,295 Último mensaje 18 Febrero 2011, 19:18 pm
por _*p
Como quitar los espacios al inicio y al final de una cadena
Programación C/C++
pefo 3 3,005 Último mensaje 14 Noviembre 2012, 15:33 pm
por djimenez39
Como declaro una variable como no dfinida o especificada en C « 1 2 »
Programación C/C++
Jack_nuts 16 9,152 Último mensaje 4 Febrero 2017, 19:18 pm
por MAFUS
Dividir cadena en subcadena C++
Programación C/C++
gomezjuan 4 4,519 Último mensaje 18 Mayo 2020, 12:53 pm
por gomezjuan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines