[ Foro de Java ]

ayuda expresiones regulares

25-Feb-2014 18:55
bryan cumbajin
4 Respuestas

Hola, quería saber si me puedes ayudar con un ejercicio que tengo, en el que me piden calcular el peso molecular.
El parámetro que me pasan al método representa la fórmula molecular de un compuesto químico, y el método devolverá el peso molecular de dicho compuesto.
Algo así:    ("CO2", 44.0095);
                  ("C6H12",84.158999);
                                                                  Ejemplo
Fórmula                                               Descripción                                                     Peso molecular
"NaCl"           1 átomo de Na (p.a. 22.9898) + 1 átomo de Cl (p.a. 35.453)               58,4428
"H2O"           2 átomos de H (p.a. 1.0079) + 1 átomo de O (p.a. 15.999)                   18,0148


package es.ulpgc.eii.strings;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringUtils {
    public static double molWeigth (String s1) {    
        double result = 0.0;
        int n = Integer.parseInt(s1);        
        Pattern patron = Pattern.compile("\\w");
        Matcher m = patron.matcher(s1);        
        while (m.find()) {
            result += n*..........;        
        }
        return result;
    }
}


Esto es lo que tengo, se que no es mucho, mi problema es que creo que la expresión "\\w" no representa la formula molecular. Y no sabría que poner a continuación de                   "result += n*......" ¿una llamada al metodo que tiene los pesos atomicos?

Ahh, y para calcular los (p.a) de los elementos, tengo un método que me devuelve el peso atómico de (tipo double) un elemento que se le pasa como parámetro en forma de objeto String.


25-Feb-2014 19:42
Nacho Cabanes (+83)

¿Y lo tienes que hacer por fuerza con expresiones regulares?  

¿No es más sencillo analizar letra a letra, y si está en mayúsculas es el comienzo de un nuevo elemento, o si hay un número es un multiplicador del símbolo anterior?


25-Feb-2014 20:07
bryan cumbajin

Si, te piden que lo hagas con expresiones regulares


26-Feb-2014 23:08
Nacho Cabanes (+83)

Lo siento, no he manejado apenas expresiones regulares en Java, pero comparando con lo que se hace en otros lenguajes, la idea debería ser algo parecido a:


PesoMolecular = 0
Mientras Texto CoincideCon( LetraMayuscula LetraMinuscula *)
    Codigo = ExtraerYEliminar( LetraMayuscula LetraMinuscula *)
    PesoAtomico = ObtenerPeso(Codigo)
    Si Texto CoincideCon( Numero+ )
        Cantidad = ExtraerYEliminar( Numero+ )
        PesoAtomico = PesoAtomico * Cantidad
    PesoMolecular = PesoMolecular + PesoAtomico


(donde A+ indica que un cierto elemento se repite al menos una vez y A* indica que quizá no aparezca).

Si además debes permitir paréntesis, se complica un poco, pero no demasiado: deberías llamar a la función con la subcadena extraída de entre los paréntesis y multiplicar el valor obtenido por la cantidad que aparece tras el cierre de paréntesis (que nuevamente sería un "Numero+", por si acaso tiene más de una cifra).


02-Mar-2014 03:00
Invitado (Niidea)

Si te enteras de como hacerlo pasalo por favor






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)