Advertisement
Sanlover

Untitled

Oct 26th, 2021
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.41 KB | None | 0 0
  1. package ser;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5.  
  6. public class SimpleExpressionSolver {
  7. private final char[] kOperators = {'+','-','*','/'};
  8.  
  9.  
  10. private ArrayList<Integer> getDepth(String expression) {
  11. ArrayList<Integer> result = new ArrayList<Integer>(Collections.nCopies(expression.length(), 0));
  12.  
  13. int layerId = 0;
  14. for (int i = 0; i < expression.length(); i++) {
  15. if (expression.charAt(i) == '(') {
  16. layerId++;
  17. result.set(i, layerId);
  18. } else if (expression.charAt(i) == ')') {
  19. result.set(i, layerId);
  20. layerId--;
  21. } else {
  22. result.set(i, layerId);
  23. }
  24. }
  25. return result;
  26. }
  27. private boolean fitDepth(ArrayList<Integer> depth){
  28. boolean isFound = false;
  29. for (Integer integer : depth) {
  30. if (integer < 1) {
  31. isFound = true;
  32. break;
  33. }
  34. }
  35. for (int i = 0 ; i < depth.size() ; i++) {
  36. depth.set(i,depth.get(i)-1);
  37. }
  38. return true;
  39. }
  40. private String fitExpression(ArrayList<Integer> depth, String expression) {
  41. if (fitDepth(depth)) {
  42. expression = expression.substring(1, expression.length() - 1);
  43. depth.remove(depth.size()-1);
  44. depth.remove(0);
  45. }
  46. return expression;
  47. }
  48. private boolean hasOperator(String expression) {
  49. for (char kOperator : kOperators) {
  50. if (expression.indexOf(kOperator) != -1) {
  51. return true;
  52. }
  53. }
  54. return false;
  55. }
  56. private boolean hasFirstFloorOperator(String expression,
  57. ArrayList<Integer> depth) {
  58. for (int i = 0; i < expression.length(); i++) {
  59. if (depth.get(i) == 0) {
  60. for (char kOperator : kOperators) {
  61. if (expression.charAt(i) == kOperator) {
  62. return true;
  63. }
  64. }
  65. }
  66. }
  67. return false;
  68. }
  69. public double calculate(String expression){
  70. expression=expression.replaceAll("\\s+","");
  71. ArrayList<Integer> depth = getDepth(expression);
  72. return calculate_method(expression,depth);
  73. }
  74. private double calculate_method(String expression, ArrayList<Integer> depth) {
  75. if (!hasOperator(expression)) {
  76. return Double.parseDouble(expression);
  77. }
  78. while (!hasFirstFloorOperator(expression, depth)) {
  79. expression = fitExpression(depth, expression);
  80. }
  81. String left = null, right = null;
  82. int operatorId = 0;
  83. boolean isFound = false;
  84. for (int k = 0; k < kOperators.length && !isFound; k++) {
  85. if (expression.indexOf(kOperators[k]) != -1) {
  86. int operatorPos = 0;
  87.  
  88. for (int j = 0; j < kOperators.length && !isFound; j++) {
  89. for (int i = 0; i < expression.length() && !isFound; i++) {
  90. if (depth.get(i) == 0) {
  91. if (expression.charAt(i) == kOperators[j]) {
  92. operatorPos = i;
  93. operatorId = j;
  94. isFound = true;
  95. }
  96. }
  97. }
  98. }
  99.  
  100. left = expression.substring(0, operatorPos);
  101. right =
  102. expression.substring(operatorPos + 1);
  103. }
  104. }
  105. switch (operatorId) {
  106. case 0 -> {
  107. return calculate_method(left, getDepth(left)) +
  108. calculate_method(right, getDepth(right));
  109. }
  110. case 1 -> {
  111. return calculate_method(left, getDepth(left)) -
  112. calculate_method(right, getDepth(right));
  113. }
  114. case 2 -> {
  115. return calculate_method(left, getDepth(left)) *
  116. calculate_method(right, getDepth(right));
  117. }
  118. case 3 -> {
  119. return calculate_method(left, getDepth(left)) /
  120. calculate_method(right, getDepth(right));
  121. }
  122. }
  123. return 0.0;
  124. }
  125. }
  126.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement