Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2015, 22:51   #1
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию Parse строки.оптимизация калькулятора

Может кто помочь оптимизировать код? буду бесконечно благодарен

Проблема сама в том что класс должен уметь считывать функцию на заданных ,как минимум 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) );
		}	
	

	
	
	
}
Тамерлан Абилов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация строки запроса Uniskull Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 3 18.12.2013 07:07
c++/строки, оптимизация кода. Joker_94 Помощь студентам 3 12.09.2013 14:44
Функция Parse(s,t) на C++ LeNZZZ Помощь студентам 2 01.11.2012 10:49
Parse(s,t) LeNZZZ Помощь студентам 5 29.10.2012 11:57