这是我写的一个计算器,可运算四则混合运算,支持多重括号签套,自己感觉写得相当不好,实现手法笨拙,效率不高,希望大家指点指点.
一:
package calcul;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class CalculateMethod {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
static int count = 0;
static ArrayList lt = new ArrayList();
// 计算前校验计算表达式的方法
public static boolean checkExpression(String str) {
int count = 0;
String checkModel = "([0-9]|[\\+\\-\\*/\\(\\).])+";
Pattern p = Pattern.compile(checkModel);
Matcher m = p.matcher(str);
boolean b1 = m.matches();
if (!b1)
return b1;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (i == 0) {
if (ch == '.' || ch == '*' || ch == '/')
return false;
}
if (ch == '.') {
if (i < str.length() - 1) {
if (!isNumeric(str.charAt(i + 1)))
return false;
} else
return false;
if (!isNumeric(str.charAt(i - 1)))
return false;
}
if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
if (i < str.length() - 1) {
if (!isNumeric(str.charAt(i + 1))
&& str.charAt(i + 1) != '(')
return false;
} else
return false;
if (i > 0) {
if (!isNumeric(str.charAt(i - 1))
&& str.charAt(i - 1) != ')') {
if (ch == '*' || ch == '/')
return false;
if (ch == '+' || ch == '-') {
if (str.charAt(i - 1) != '(')
return false;
}
}
}
}
}
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch == '(')
++count;
else if (ch == ')')
--count;
}
if (count != 0)
return false;
for (int i = 0; i < str.length(); i++) {
try {
char ch = str.charAt(i);
if (ch == '(') {
if (str.charAt(i + 1) == ')')
return false;
} else if (ch == ')') {
if (str.charAt(i + 1) == '(')
return false;
if (isNumeric(str.charAt(i + 1)))
return false;
}
} catch (Exception e) {
return true;
}
}
if (count != 0)
return false;
return true;
}
// 判断是否是数字的方法
public static boolean isNumeric(char str) {
String checkModel = "[0-9]+";
Pattern p = Pattern.compile(checkModel);
Matcher m = p.matcher(String.valueOf(str));
boolean b = m.matches();
return b;
}
// 设置输入框显示值的方法
public static void setJText(String jbName) {
CalculateTextPanel c = CalculateTextPanel.getCalculateTextPanel();
JTextField jt = c.jt;
c.setTestValue(jt.getText() + jbName);
}
// 提取括号里的计算式方法
public static String getString(String str) throws MyException {
String string = new String();
int count = 0;
int leftCount = 0;
int rightCount = 0;
for (int i = 0; i < str.length(); i++) {
char temp = str.charAt(i);
if (temp == '(') {
leftCount = i;
count++;
continue;
}
if (temp == ')') {
rightCount = i;
break;
}
}
if (count == 0)
return str;
if (count != 0) {
String s1 = str.substring(leftCount + 1, rightCount);
String s2 = str.substring(leftCount, rightCount + 1);
String strtemp = result2(result1(subStr(s1)));
string = str.replace(s2, strtemp);
}
return string;
}
public static int getCount(String str) {
int count = 0;
for (int i = 0; i < str.length(); i++) {
char temp = str.charAt(i);
if (temp == '(') {
count++;
continue;
}
}
return count;
}
public static String getStr(String str) throws MyException {
int count = getCount(str);
if (count == 0)
return str;
else
for (int i = 0; i < count; i++) {
str = getString(str);
}
return str;
}
// 分解没有括号的计算表达式
public static ArrayList subStr(String str) {
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (i != 0 && !CalculateMethod.isNumeric(str.charAt(i))) {
lt.add(str.substring(0, i));
lt.add(str.substring(i, i + 1));
str = str.substring(i + 1);
count++;
if (str.indexOf("+") == -1 && str.indexOf("-") == -1
&& str.indexOf("*") == -1 && str.indexOf("/") == -1) {
lt.add(str);
break;
}
subStr(str);
break;
}
}
for (int i = 0; i < lt.size(); i++) {
if (lt.get(i).equals(".")) {
Object ob1 = lt.get(i - 1);
Object ob2 = lt.get(i);
Object ob3 = lt.get(i + 1);
String s = ob1.toString() + ob2.toString() + ob3.toString();
lt.set(i - 1, s);
lt.remove(i);
lt.remove(i);
}
}
if (!lt.get(1).equals("+") && !lt.get(1).equals("-")
&& !lt.get(1).equals("*") && !lt.get(1).equals("/")
&& !lt.get(1).equals("(")) {
lt.remove(0);
}
return lt;
}
// 两个数计算的表达式的计算方法
public static String mulAndDivi(String num1, String sign, String num2)
throws MyException {
double dnum1 = Double.parseDouble(num1);
double dnum2 = Double.parseDouble(num2);
double result = 0;
if (sign.equals("*"))
result = dnum1 * dnum2;
else if (sign.equals("/")) {
result = dnum1 / dnum2;
if (dnum2 == 0)
throw new MyException("除数为0");
} else if (sign.equals("+"))
result = dnum1 + dnum2;
else if (sign.equals("-"))
result = dnum1 - dnum2;
return Double.toString(result);
}
// 计算乘除的方法
public static ArrayList result1(ArrayList lt) throws MyException {
for (int i = 0; i < lt.size(); i++) {
if (lt.get(i).equals("*") || lt.get(i).equals("/")) {
Object ob1 = lt.get(i - 1);
Object ob2 = lt.get(i);
Object ob3 = lt.get(i + 1);
String result = CalculateMethod.mulAndDivi(ob1.toString(), ob2
.toString(), ob3.toString());
lt.set(i - 1, result);
lt.remove(i);
lt.remove(i);
result1(lt);
break;
}
}
return lt;
}
// 计算加减的方法
public static String result2(ArrayList lt) throws MyException {
if (lt.size() > 1) {
String result = CalculateMethod.mulAndDivi(lt.get(0).toString(), lt
.get(1).toString(), lt.get(2).toString());
lt.remove(0);
lt.remove(0);
lt.remove(0);
lt.add(0, result);
result2(lt);
}
return lt.get(0).toString();
}
// 取得最后结果的方法
public static String getResult(String s) throws MyException {
String str = CalculateMethod.getStr(s);
ArrayList lt1 = CalculateMethod.subStr(str);
ArrayList lt2 = CalculateMethod.result1(lt1);
String lt3 = CalculateMethod.result2(lt2);
count = 0;
lt.clear();
return lt3;
}
}
二:
package calcul;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Map;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JPanel;
public class CalculatePanel extends JPanel {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
private JButton jb[] = new JButton[20];
private String[] jbName = new String[] { "0", "1", "2", "3", "4", "5", "6",
"7", "8", "9", "=", "+", "-", "*", "/", "(", ")", ".", "清零", "关闭" };
public CalculatePanel() {
Font font = new Font("Serif", Font.BOLD, 14);
this.setLayout(new GridLayout(4, 5, 3, 3));
this.setBackground(Color.BLUE);
for (int i = 0; i < 20; i++) {
jb[i] = new JButton(jbName[i]);
jb[i].setFont(font);
jb[i].setSize(1, 1);
this.add(jb[i]);
}
addListenerMethod();
}
public void myAction(){
CalculateTextPanel c = CalculateTextPanel
.getCalculateTextPanel();
String result;
JTextField jt = c.jt;
if (jt.getText() != null) {
boolean b = CalculateMethod.checkExpression(jt
.getText());
if (!b) {
JOptionPane
.showMessageDialog(null, "计算表达式不正确!");
jt.setText(null);
CalculateMethod.count = 0;
CalculateMethod.lt.clear();
} else
try {
CalculateMethod.setJText("="
+ CalculateMethod.getResult(jt
.getText().trim()
.toString()));
} catch (MyException e1) {
JOptionPane
.showMessageDialog(null, "除数为零!");
jt.setText(null);
CalculateMethod.count = 0;
CalculateMethod.lt.clear();
}
}
}
public void addListenerMethod() {
for (int i = 0; i < 18; i++) {
if (i != 10)
jb[i].addActionListener(new KeyAction(jbName[i]));
else {
jb[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myAction();
}
});
jb[19].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
}
jb[18].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CalculateTextPanel c = CalculateTextPanel
.getCalculateTextPanel();
JTextField jt = c.jt;
jt.setText(null);
}
});
}
}
三:
package calcul;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class CalculateTextPanel extends JPanel {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
private static final CalculateTextPanel c = new CalculateTextPanel();
JTextField jt = new JTextField();
private CalculateTextPanel() {
jt.setHorizontalAlignment(JTextField.RIGHT);
this.setBackground(Color.BLUE);
this.setLayout(new BorderLayout());
this.add("Center", jt);
}
public static CalculateTextPanel getCalculateTextPanel() {
return c;
}
public void setTestValue(String str) {
jt.setText(str);
}
}
四:
package calcul;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import java.awt.Color;
public class CalculateFrame extends JFrame{
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
static int WIDTH;
static int HIGHT;
public CalculateFrame() {
this.setResizable(false);
this.setTitle("记算器" + " " + "Justin"+" "+ "http://suhuanxi.iteye.com");
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
WIDTH = screenWidth / 3;
HIGHT = screenHeight / 4;
this.setLocation(screenWidth / 4, screenHeight / 4);
this.setSize(WIDTH, HIGHT);
this.setBackground(Color.BLUE);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CalculateTextPanel panel1 =CalculateTextPanel.getCalculateTextPanel();
CalculatePanel panel2 = new CalculatePanel();
CalculateBottomPanel panel3 = new CalculateBottomPanel();
this.setLayout(new BorderLayout());
this.add("North",panel1);
this.add("Center",panel2);
this.add("South",panel3);
}
}
五:
package calcul;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
public class KeyAction implements ActionListener{
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
String jbName;
KeyAction(String jbName){
this.jbName=jbName;
}
public void actionPerformed(ActionEvent arg0) {
CalculateMethod.setJText(jbName);
}
}
六:
package calcul;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
public class CalculateBottomPanel extends JPanel {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
CalculateBottomPanel() {
this.setBackground(Color.WHITE);
}
protected void paintComponent(Graphics g) {
Font f1 = new Font("Serif", Font.BOLD, 10);
g.setFont(f1);
g.setColor(Color.blue);
super.paintComponent(g);
g.drawString("版权所有,翻版必究", 110, 8);
}
}
七:
package calcul;
public class MyException extends Exception{
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
public MyException(String msg){
super(msg);
}
}
八:
package calcul;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class MainRun {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
public static void main(String[] args) {
CalculateFrame frame = new CalculateFrame();
frame.setVisible(true);
frame.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
}