大資料統計專案遇到的問題:
按照計算模型對現有資料統計、分析、**
一般的計算模型是乙個或多個運算公式,通常是加減乘除四則運算
計算模型需要執行期編輯
設計方案要有高擴充套件性
計算模型按正常算術方式書寫,直譯器處理語法邏輯
計算模型裡有兩類符號:資料和計算符
用逆波蘭演算法分析算式語法
用直譯器模式處理資料
[外鏈轉存失敗(img-xpybo3hh-1568648786773)(
- cls 該包為各種逆波蘭之後的各種計算方式
- - abstractexpresstion 抽象類,所有的超類(hashmap為一列資料)
- - - varexpresstion 終結表示式(變數表示式)
- - - symbolexpresstion 非終結表示式(符號表示式,抽象類)
- - - - addexpresstion 加
- - - - subexpresstion 減
- - - - multiexpresstion 乘
- - - - divexpresstion 除
public abstract class abstractexpresstion
public class varexpresstion extends abstractexpresstion
@override
public float interpreter(hashmapvar)
}public abstract class symbolexpresstion extends abstractexpresstion
}public class addexpresstion extends symbolexpresstion
@override
public float interpreter(hashmapvar)
}public class subexpresstion extends symbolexpresstion
@override
public float interpreter(hashmapvar)
}public class multiexpresstion extends symbolexpresstion
@override
public float interpreter(hashmapvar)
}public class divexpresstion extends symbolexpresstion
@override
public float interpreter(hashmapvar)
}public class rpn
} // 將中序表示式轉換為右序表示式
private void toright() else
} else
astack.push(expression.get(position));}}
} else
right.add(expression.get(position));
position++;
if (position >= expression.size())
break;
} while (astack.top != -1)
} // 對右序表示式進行求值
public void getresult(hashmapvar) else
stack.push(new varexpresstion(is));
} result = stack.pop();
it = expression.iterator();
while (it.hasnext())
system.out.println("=" + result.interpreter(var));
} public static class calculate
// 設定操作符號的優先級別
public static int priority(string operator)
// 做2值之間的計算
public static abstractexpresstion tworesult(string op,
abstractexpresstion a, abstractexpresstion b) catch (numberformatexception e)
} }// 棧類
public class stacks
public object pop()
public object top()
}}
public class calculator
system.out.println(";");
} try
}system.out.println("input another expression or input 'q' to quit:");
}is.close();
} catch (ioexception e) }}
public class interpretertest
}
執行test類後在控制台輸入:a、b、c、d、e、f為變數的包含可以±*/()的運算公式,然後回車得出結果.
直譯器模式定義乙個語法, 定義乙個直譯器,該直譯器處理該語法句子
將某些複雜問題,表達為某種語法規則,然後構建直譯器來解釋處理這類句子
[外鏈轉存失敗(img-5jgdlcbq-1568648786775)(
缺點:
盡量不要在重要的模組中使用直譯器模式
直譯器模式在實際的系統開發中使用的非常少
可以考慮一下expression4j、mesp、jep等開源的解析工具包
當你有乙個簡單語法,而且效率不是問題的時候
一些資料分析工具、報表設計工具、科學計算工具等
設計模式從入門到精通 19 直譯器模式
目錄通過直譯器模式來實現四則運算,如計算a b c的值,具體要求 傳統方案解決四則運算問題分析 4 這樣的例子還有,比如編譯器 運算表示式計算 正規表示式 機械人等 原理類圖 直譯器模式的角色及職責 uml 類圖 核心 抽象表示式 抽象表示式類 public abstract class expre...
設計模式 直譯器模式
未來機器智慧型化已然成為趨勢,現在手機都能聽懂英語和普通話,那我大中華幾萬種方言的被智慧型化也許也是趨勢,我們的方言雖然和普通話相似,但是還是不一樣的。這可能需要乙個新的語法分析器來幫助我們。我們的直譯器模式就是描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。但...
設計模式 直譯器模式
直譯器模式 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。當有乙個語言需要解釋執行,並...