Guest User

Untitled

a guest
Jul 12th, 2015
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.04 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.regex.Pattern;
  3. import java.util.regex.Matcher;
  4.  
  5. public class AESupport {
  6.     public double publicCalculation(String expression){
  7.         double resultOfCalculation = privateCalculation(expression);
  8.         return resultOfCalculation;
  9.     }
  10.  
  11.     private double privateCalculation(String expression){
  12.  
  13.         // Преобразуем входную строку в набор токенов из операторов, операнд и скобок
  14.         ArrayList<String> list = parseToArrayList(expression);
  15.  
  16.         // Расставляем для всех токенов уровни
  17.         ArrayList<Integer> levelList = tokenRanking(list);
  18.  
  19.         // Рекурсивно считаем
  20.         double resultOfCalculation = calculation(list, levelList);
  21.  
  22.         return resultOfCalculation;
  23.     }
  24.  
  25.  
  26.     private ArrayList<String> parseToArrayList(String expression){
  27.         Pattern pattern = Pattern.compile("[-+*//(/)]|-?\\d+(\\.\\d+)?");
  28.         // Регулярное выражения для парсинга арифметического выражения
  29.         // [-+*//(/)] - первые четыре символа - операции, остальные четыре символа - заэкранированные скобки
  30.         // | - ИЛИ
  31.         // -?\d+(\.\d+)? регулярка для числа, которое возможно отрицательное и/или дробное
  32.  
  33.         ArrayList<String> list = new ArrayList<String>();
  34.         Matcher matcher = pattern.matcher(expression);
  35.         while (matcher.find()){//Пока находим совпадения регулярке - добавляем в ArrayList
  36.             list.add(expression.substring(matcher.start(), matcher.end()));
  37.         }
  38.         return list;
  39.     }
  40.  
  41.     private ArrayList<Integer> tokenRanking(ArrayList<String> list){
  42.         ArrayList<Integer> levelList = new ArrayList<Integer>(list.size());
  43.         int tokenLevel = 0;
  44.         for (int i = 0; i < list.size(); i++){
  45.             if (list.get(i).matches("[(]||-?\\d+(\\.\\d+)?")){
  46.                 //если данный элемент - это открывающаяся скобка или число, то увеличиваем его уровень на 1
  47.                 tokenLevel++;
  48.                 //и добавляем уровень в ArrayList
  49.                 levelList.add(i, tokenLevel);
  50.             }
  51.             else{
  52.                 tokenLevel--;
  53.                 levelList.add(i, tokenLevel);
  54.             }
  55.         }
  56.         return levelList;
  57.     }
  58.  
  59.     private double calculation(ArrayList<String> list, ArrayList<Integer> levelList) {
  60.         double answer;
  61.  
  62.         // Вычисляем максимальный уровень и запоминаем место, где он находится
  63.         int maxLevel = 0;
  64.         int maxLevelPosition = 0;
  65.         for (int i = 0; i < list.size(); i++) {
  66.             if (levelList.get(i) > maxLevel) {
  67.                 maxLevel = levelList.get(i);
  68.                 maxLevelPosition = i;
  69.             }
  70.         }
  71.  
  72.         // Вычисление операции
  73.         double tempValue = 0;
  74.         if (list.get(maxLevelPosition + 1).equals("-")){
  75.             tempValue = Double.parseDouble(list.get(maxLevelPosition)) - Double.parseDouble(list.get(maxLevelPosition + 2));
  76.         }
  77.         else if (list.get(maxLevelPosition + 1).equals("+")){
  78.             tempValue = Double.parseDouble(list.get(maxLevelPosition)) + Double.parseDouble(list.get(maxLevelPosition + 2));
  79.         }
  80.         else if (list.get(maxLevelPosition + 1).equals("*")){
  81.             tempValue = Double.parseDouble(list.get(maxLevelPosition)) * Double.parseDouble(list.get(maxLevelPosition + 2));
  82.         }
  83.         else if (list.get(maxLevelPosition + 1).equals("/")){
  84.             tempValue = Double.parseDouble(list.get(maxLevelPosition)) / Double.parseDouble(list.get(maxLevelPosition + 2));
  85.         }
  86.  
  87.         // Запись результата операции
  88.         list.add(maxLevelPosition, Double.toString(tempValue));
  89.  
  90.         // Удаление уже ненужных операнд, операции и скобок
  91.         list.remove(maxLevelPosition - 1);
  92.         for (int i = 0; i < 4; i++){
  93.             list.remove(maxLevelPosition);
  94.         }
  95.         list.trimToSize();
  96.  
  97.         // Удаление уровней для уже удаленных операнд, операции и скобок
  98.         for (int i = 0; i < 4; i++){
  99.             levelList.remove(maxLevelPosition);
  100.         }
  101.         levelList.trimToSize();
  102.  
  103.         // Если первый токен - это не скобка, значит вычисления закончились,
  104.         // иначе продолжаем считать
  105.         if (!((list.get(0).equals("("))||(list.get(0).equals(")")))) {
  106.             answer = Double.parseDouble(list.get(0));
  107.         }
  108.         else {
  109.             answer = calculation(list, levelList);
  110.         }
  111.  
  112.         return answer;
  113.     }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment