Наконец то закончил с алгоритмом и тут меня расстраивает последний пункт, прошу помочь
package com.javarush.task.task34.task3404;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
Рекурсия для мат. выражения
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
solution.recurse("2 ^ 0.5", 0); // expected output 1.41 1
solution.recurse("(-(10))", 0); // expected output -10 1
solution.recurse("-sin(2*(-5+1.5*4)+28)", 0); // expected output -0.5 7
}
public void recurse(final String expression, int countOperation) {
String string = expression;
char[] chars = string.toCharArray();
int min = 0, min1 = 0;
int countOper = countOperation;
for (int i = 0; i < chars.length; i++) {
if(chars[i] == '('){
min = i;
}
}
for (int i = min; i < chars.length; i++) {
if(chars[i] ==')'){
min1 = i;
break;
}
}
if(min == 0 && min1 == 0){
String s = "";
for (int i = 0; i < chars.length; i++) {
s += chars[i];
}
if(isItNumber(s)){
s = s.replace(",", ".");
Double d = Double.parseDouble(s);
BigDecimal result = new BigDecimal(d);
result = result.setScale(2, RoundingMode.HALF_DOWN);
if(d < 0 && countOper == 0){
countOper++;
}
System.out.println(new DecimalFormat("#.##").format(result.doubleValue()) + " " + countOper);
}
else {
for (int i = 0; i < chars.length; i++) {
if(!isItNumber(chars[i] + "")){
if (chars[i] != '.' && chars[i] != ' ') {
countOper++;
if(chars[i] == 's' || chars[i] == 'c' || chars[i] == 't'){
i += 2;
}
}
}
}
s = calculate(s);
s = s.replace(",", ".");
Double d = Double.parseDouble(s);
BigDecimal result = new BigDecimal(d);
result = result.setScale(2, RoundingMode.HALF_DOWN);
if(d < 0 && countOper == 0){
countOper++;
}
System.out.println(new DecimalFormat("#.##").format(result.doubleValue()) + " " + countOper);
}
}
else{
boolean countWasUpped = false;
String string1 = "";
for (int i = min + 1; i < min1; i++) {
string1 = string1 + chars[i];
}
for (int i = min + 1; i < min1; i++) {
if(!isItNumber(chars[i] + "")){
if (chars[i] != '.' && chars[i] != ' ') {
countOper++;
if(chars[i] == 's' || chars[i] == 'c' || chars[i] == 't'){
i += 2;
}
countWasUpped = true;
}
}
}
String generalString = "";
if(isItNumber(string1)){
if(countWasUpped && Double.parseDouble(string1) < 0){
countOper--;
}
for (int i = 0; i < chars.length; i++) {
if(i == min){
generalString = generalString + string1;
}
else if(i < min || i > min1){
generalString = generalString + chars[i];
}
}
Solution solution = new Solution();
solution.recurse(generalString, countOper);
}
else{
String string2 = calculate(string1);
if(countWasUpped && Double.parseDouble(string2) < 0){
countOper--;
}
for (int i = 0; i < chars.length; i++) {
if(i == min){
generalString = generalString + string2;
}
else if(i < min || i > min1){
generalString = generalString + chars[i];
}
}
Solution solution = new Solution();
solution.recurse(generalString, countOper);
}
}
}
public String calculate(String string){
char[] chars = string.toCharArray();
List<String> list = new ArrayList<>();
List<String> integers = new ArrayList<>();
for (int i = 0; i < chars.length; i++) {
String s = "" + chars[i];
if (isItNumber(s) && !s.equals(" ")) {
while (isItNumber(s) && i < chars.length) {
integers.add(s);
i++;
if (i < chars.length) {
s = "" + chars[i];
}
}
if (s.equals(".")) {
i++;
s = "" + chars[i];
integers.add("del");
while (isItNumber(s) && i < chars.length) {
integers.add(s);
i++;
if (i < chars.length) {
s = "" + chars[i];
}
}
list.add(createDouble(integers));
} else {
list.add(createNumber(integers));
}
integers.clear();
i--;
}
else if(s.equals("s")){
list.add("sin");
i += 2;
}
else if(s.equals("c")){
list.add("cos");
i += 2;
}
else if(s.equals("t")){
list.add("tan");
i += 2;
}
else if(!s.equals(" ")){
list.add(s);
}
}
double result = 0;
List<String> list1 = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if(list.get(i).equals("-") && i == 0){
if(isItNumber(list.get(i + 1))){
list1.add(String.valueOf(Double.parseDouble(list.get(i + 1)) * -1));
i++;
}
else{
list1.add("-1");
list1.add("*");
}
}
else if(list.get(i).equals("-")){
if(isItNumber(list.get(i - 1)) && isItNumber(list.get(i + 1))){
list1.add("-");
}
else if(isItNumber(list.get(i - 1)) && !isItNumber(list.get(i + 1))){
list1.add("+");
list1.add("-1");
list1.add("*");
}
else if(!isItNumber(list.get(i - 1)) && isItNumber(list.get(i + 1))){
list1.add(String.valueOf(Double.parseDouble(list.get(i + 1)) * -1));
i++;
}
}
else{
list1.add(list.get(i));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("sin")){
list1.add(String.valueOf(Math.sin(Double.parseDouble(list.get(j + 1)) * Math.PI / 180)));
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("cos")){
list1.add(String.valueOf(Math.cos(Double.parseDouble(list.get(j + 1)) * Math.PI / 180)));
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("tan")){
list1.add(String.valueOf(Math.tan(Double.parseDouble(list.get(j + 1)) * Math.PI / 180)));
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("^")){
list1.add(String.valueOf(Math.pow(Double.parseDouble(list1.get(list1.size() - 1)), Double.parseDouble(list.get(j + 1)))));
list1.remove(list1.size() - 2);
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("/")){
list1.add(String.valueOf(Double.parseDouble(list1.get(list1.size() - 1)) / Double.parseDouble(list.get(j + 1))));
list1.remove(list1.size() - 2);
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("*")){
list1.add(String.valueOf(Double.parseDouble(list1.get(list1.size() - 1)) * Double.parseDouble(list.get(j + 1))));
list1.remove(list1.size() - 2);
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("-")){
list1.add(String.valueOf(Double.parseDouble(list1.get(list1.size() - 1)) - Double.parseDouble(list.get(j + 1))));
list1.remove(list1.size() - 2);
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("+")){
list1.add(String.valueOf(Double.parseDouble(list1.get(list1.size() - 1)) + Double.parseDouble(list.get(j + 1))));
list1.remove(list1.size() - 2);
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
String s = list.get(0);
return s;
}
public String createDouble(List<String> list){
int i = 0;
String result = "";
while(list.get(i) != "del"){
result = result + Integer.parseInt(list.get(i));
i++;
}
result = result + ".";
i++;
while(i < list.size()){
result += Integer.parseInt(list.get(i));
i++;
}
return result;
}
public String createNumber(List<String> list){
double n = 0;
if(list.size() == 1){
n = Integer.parseInt(list.get(0));
}
else{
for (int i = list.size() - 1; i >= 0; i--) {
n += Integer.parseInt(list.get(i)) * Math.pow(10, list.size() - 1 - i);
}
}
return String.valueOf(n);
}
public boolean isItNumber(String s){
try{
double a = Double.parseDouble(s);
return true;
}
catch (Exception e){
return false;
}
}
public Solution() {
//don't delete
}
}