Может кто помочь оптимизировать код? буду бесконечно благодарен
Проблема сама в том что класс должен уметь считывать функцию на заданных ,как минимум 10 000 точек, без проблем(Рендерить график ) и т.д..
А мне нужно как то остерегаться повторных действий .к примеру,операторы не изменяются,не зависят от аргумента.Или же сама структура данных.
Все просто
5+6+(7+9)*2
[7, 9]
[5, 6, 16, 2]
[5, 6, 32]
[11,32]
[43]
Реализовывал это с помощью Линк лист.
но если будет x + 6 + (7+9) * 2,работает так..
но как макс. оптимизировать такой случай?
Сохранять тут можно операторы на последующий вызов функции..
Код:
import java.util.*;
public class StringFunc {
private StringBuilder func;
private static Scanner sc;
private static String a,b;
public static PriorityQueue<Integer> op = new PriorityQueue<Integer>();
static LinkedList<String> nums;
public StringFunc(){
System.out.println("Введите выражение : ") ;sc = new Scanner(System.in);
this.func = new StringBuilder(input());
}
public StringFunc ( String expr){
sc = new Scanner(expr);
this.func = new StringBuilder(input());
}
private String calc(String a, String b, String operator){
switch (operator) {
case "+": return Double.valueOf(a) + Double.valueOf(b)+"";
case "~": return Double.valueOf(a) - Double.valueOf(b)+"";
case "*": return Double.valueOf(a) * Double.valueOf(b)+"";
case "/": return Double.valueOf(a) / Double.valueOf(b)+"";
case "^": return Math.pow(Double.valueOf(a) ,Double.valueOf(b))+"";
}
return null;
}
public StringBuilder input(){ // ready to operate.
String buf = sc.next().replaceAll("e", 2.728281+"");
return signtotild((new StringBuilder(buf)));
}
private StringBuilder signtotild(StringBuilder s){ // to make difference between minus operator and sign(with tild) . -5--2-2-(-2+2)
for (int i = 1; i < s.length(); i++)
if ((s.charAt(i) == '-') && ("+-*(/~".indexOf(s.charAt(i-1)) == -1)) // operator..
s.replace(i,i+1,"~");
return s;
}
private int setPriority(StringBuilder s, String priority){
for (int i = 0; i < priority.length(); i++)
if ( s.indexOf(priority.charAt(i)+"" ) > -1 )
return s.indexOf(priority.charAt(i)+"");
return 0;
}
private String operate(String expression){
int index ;
nums= new LinkedList<String>(Arrays.asList( expression.split("[^0-9\\-E.]"))); // 5-6+-4 , [ 5, 6, -4];
Character priorityOperator;
StringBuilder operators = new StringBuilder(expression.replaceAll("[0-9\\-E.]","")); // 5-6+-4 , -+;
while (!( nums.size() == 1 ))
{
priorityOperator = operators.charAt( ( index = setPriority(operators, "^/*~+")) );
operators.deleteCharAt(index);
nums.set(index, calc((a = nums.remove(index)) ,(b = nums.get(index)), priorityOperator+"")); // [5, 6, -4] --> [ 5, 2]
}
return nums.remove();
}
private String operateWithBracket(StringBuilder s){
if ( s.indexOf(")") == -1) // Нет скобок.
return operate(s.toString());
else {
String in = ( in =s.substring(0, s.indexOf(")")) ) .substring ( in.lastIndexOf("(") + 1 ); // new bracket
return operateWithBracket( s.replace ( s.indexOf("("+in+")"), s.indexOf("("+in+")") + in.length() +2, operate( in ) ) ); // finally , 5+(5+5) --> 5+10
}
}
public double f(double x , double U){
StringBuilder function2th = new StringBuilder(func.toString().replaceAll("x",x+"").replaceAll("U", U+""));
return Double.valueOf(operateWithBracket(function2th));
}
public double f(double x ){
StringBuilder function = new StringBuilder(func.toString().replaceAll("x",x+""));
return Double.valueOf(operateWithBracket(function));
}
public void toTable(double x, double a, double h){
long begin = System.currentTimeMillis();
for ( x = x ; x <= a ; x+=h){ //
StringBuilder function = new StringBuilder(func.toString().replaceAll("x",x+""));
System.out.printf("%8.2f | %8.5f \n ",x,Double.valueOf( operateWithBracket(function) )); // without output 10 000 calls ~ 330 ms.
System.out.printf("-------------------------- \n");
}
System.out.println( " Время : " + (System.currentTimeMillis() - begin) );
}
}