postfija - expresion aritmetica en java
¿Cómo dividir una expresión matemática en operadores como delimitadores, manteniéndolos en el resultado? (5)
Necesito dividir una expresión como
a+b-c*d/e
y obtenga a
, b
, c
, d
, e
separado (como una matriz de cadenas) así como =
, -
, *
, d
, /
(también una matriz de operadores) por separado. He intentado como:
String myString;
String myString={"a+b-c*d/e");
String[] result=new String();
String[] separator=new String[]{"+","-","/","*"};
result=myString.split(separator);
Pero, muestra un error. ¿Cómo resolverlo?
Además del enfoque de split
, también puedes usar java.util.StringTokenizer
:
String myString = "a+b-c*d/e";
List<String> operatorList = new ArrayList<String>();
List<String> operandList = new ArrayList<String>();
StringTokenizer st = new StringTokenizer(myString, "+-*/", true);
while (st.hasMoreTokens()) {
String token = st.nextToken();
if ("+-/*".contains(token)) {
operatorList.add(token);
} else {
operandList.add(token);
}
}
System.out.println("Operators:" + operatorList);
System.out.println("Operands:" + operandList);
Resultado:
Operators:[+, -, *, /]
Operands:[a, b, c, d, e]
Creo que lo que quieres hacer es más como un analizador, en lugar de un tokenizador.
Con un tokenizador de cadenas, generalmente tiene una cadena larga (es decir, "parámetro1; parámetro2; parámetro3") con varios elementos concatenados y utilizando un "token" para separar estos elementos. Con la función "String.split", básicamente estás diciendo: "Ok, da todos los elementos de esta cadena, pero teniendo en cuenta ese carácter"; separa diferentes elementos ". Y luego obtienes "parameter1", "parameter2", "parameter3". No te importan los separadores.
Pero en una expresión matemática como la tuya: "a + bc * d / e", quieres obtener todos los elementos individuales (operandos y operadores). Aquí no hay separadores explícitos, y el orden también es importante para usted. Usaría una biblioteca de analizador y escribiría una pequeña gramática en su lugar.
Por lo que sé, no puedes hacer lo que eres después de que salga de la caja. La split(String regex)
no toma una matriz completa (a diferencia de C #), solo una cadena que representa una expresión regular válida.
Lo que podría hacer sería definir un Set
que contenga sus operadores y 2 ArrayLists
. Una vez que tenga eso, itere sobre su cadena, verifique si el conjunto contiene ese carácter dado (determinando así si es un operador o no). Si lo es, entonces, lo pones en una lista, si no, lo pones en la otra.
Finalmente, puede usar toArray(new String/[arraySize/])
para recuperar sus ArrayLists
como matrices de cadenas.
Solo para obtener el a / b / c / d / e:
String myString = "a+b-c*d/e";
String[] result=myString.split("[-+*/]");
En una forma más legible:
String myString = "a+b-c*d/e";
String[] result2=myString.split("["+Pattern.quote("+-*/")+"]");
Para obtener el + - * /:
ArrayList<Character> list = new ArrayList<Character>();
for (char c:myString.toCharArray())
{
if ("+-*/".contains(""+c)) list.add(c);
}
System.out.println(list);
Editar: eliminó los caracteres de escape innecesarios.
Primer problema: -
Declaración múltiple de String myString;
Segundo problema: -
Cadena inicializada incorrectamente Faltan citas dobles en los extremos. Retire el soporte y la abrazadera de los extremos.
String myString = "a+b-c*d/e";
3er problema: -
Arrastre de cadena inicializado con un objeto String, en lugar de un objeto de matriz.
String[] result=new String(); // Should be `new String[size]`
De hecho, no es necesario inicializar su matriz de antemano.
4º problema: -
String.split
toma una expresión regular como argumento, ha pasado una matriz. No trabajará.
Utilizar: -
String[] result = myString.split("[-+*/]");
para dividir en todos los operadores.
Y con respecto a su esta declaración: -
así como
=, -, *, d, /
(también un conjunto de operadores) por separado.
No entiendo lo que quieres aquí. Su cadena de muestra no contiene =
. d
no es un operator
. Por favor, mira si quieres editarlo.
ACTUALIZACIÓN: -
Si quiere mantener a los operadores también en su matriz, puede usar esta expresión regular:
String myString= "a+b-c*d/e";
String[] result = myString.split("(?<=[-+*/])|(?=[-+*/])");
System.out.println(Arrays.toString(result));
/*** Just to see, what the two parts in the above regex print separately ***/
System.out.println(Arrays.toString(myString.split("(?<=[-+*/])")));
System.out.println(Arrays.toString(myString.split("(?=[-+*/])")));
SALIDA: -
[a, +, b, -, c, *, d, /, e]
[a+, b-, c*, d/, e]
[a, +b, -c, *d, /e]
(?<=...)
significa look-behind assertion
, y (?=...)
significa look-ahead assertion
.