Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.regex.Pattern;
- import java.util.regex.Matcher;
- public class AESupport {
- public double publicCalculation(String expression){
- double resultOfCalculation = privateCalculation(expression);
- return resultOfCalculation;
- }
- private double privateCalculation(String expression){
- // Преобразуем входную строку в набор токенов из операторов, операнд и скобок
- ArrayList<String> list = parseToArrayList(expression);
- // Расставляем для всех токенов уровни
- ArrayList<Integer> levelList = tokenRanking(list);
- // Рекурсивно считаем
- double resultOfCalculation = calculation(list, levelList);
- return resultOfCalculation;
- }
- private ArrayList<String> parseToArrayList(String expression){
- Pattern pattern = Pattern.compile("[-+*//(/)]|-?\\d+(\\.\\d+)?");
- // Регулярное выражения для парсинга арифметического выражения
- // [-+*//(/)] - первые четыре символа - операции, остальные четыре символа - заэкранированные скобки
- // | - ИЛИ
- // -?\d+(\.\d+)? регулярка для числа, которое возможно отрицательное и/или дробное
- ArrayList<String> list = new ArrayList<String>();
- Matcher matcher = pattern.matcher(expression);
- while (matcher.find()){//Пока находим совпадения регулярке - добавляем в ArrayList
- list.add(expression.substring(matcher.start(), matcher.end()));
- }
- return list;
- }
- private ArrayList<Integer> tokenRanking(ArrayList<String> list){
- ArrayList<Integer> levelList = new ArrayList<Integer>(list.size());
- int tokenLevel = 0;
- for (int i = 0; i < list.size(); i++){
- if (list.get(i).matches("[(]||-?\\d+(\\.\\d+)?")){
- //если данный элемент - это открывающаяся скобка или число, то увеличиваем его уровень на 1
- tokenLevel++;
- //и добавляем уровень в ArrayList
- levelList.add(i, tokenLevel);
- }
- else{
- tokenLevel--;
- levelList.add(i, tokenLevel);
- }
- }
- return levelList;
- }
- private double calculation(ArrayList<String> list, ArrayList<Integer> levelList) {
- double answer;
- // Вычисляем максимальный уровень и запоминаем место, где он находится
- int maxLevel = 0;
- int maxLevelPosition = 0;
- for (int i = 0; i < list.size(); i++) {
- if (levelList.get(i) > maxLevel) {
- maxLevel = levelList.get(i);
- maxLevelPosition = i;
- }
- }
- // Вычисление операции
- double tempValue = 0;
- if (list.get(maxLevelPosition + 1).equals("-")){
- tempValue = Double.parseDouble(list.get(maxLevelPosition)) - Double.parseDouble(list.get(maxLevelPosition + 2));
- }
- else if (list.get(maxLevelPosition + 1).equals("+")){
- tempValue = Double.parseDouble(list.get(maxLevelPosition)) + Double.parseDouble(list.get(maxLevelPosition + 2));
- }
- else if (list.get(maxLevelPosition + 1).equals("*")){
- tempValue = Double.parseDouble(list.get(maxLevelPosition)) * Double.parseDouble(list.get(maxLevelPosition + 2));
- }
- else if (list.get(maxLevelPosition + 1).equals("/")){
- tempValue = Double.parseDouble(list.get(maxLevelPosition)) / Double.parseDouble(list.get(maxLevelPosition + 2));
- }
- // Запись результата операции
- list.add(maxLevelPosition, Double.toString(tempValue));
- // Удаление уже ненужных операнд, операции и скобок
- list.remove(maxLevelPosition - 1);
- for (int i = 0; i < 4; i++){
- list.remove(maxLevelPosition);
- }
- list.trimToSize();
- // Удаление уровней для уже удаленных операнд, операции и скобок
- for (int i = 0; i < 4; i++){
- levelList.remove(maxLevelPosition);
- }
- levelList.trimToSize();
- // Если первый токен - это не скобка, значит вычисления закончились,
- // иначе продолжаем считать
- if (!((list.get(0).equals("("))||(list.get(0).equals(")")))) {
- answer = Double.parseDouble(list.get(0));
- }
- else {
- answer = calculation(list, levelList);
- }
- return answer;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment