Android小项目———— 冰炭不投de小计算器

我的第一个Android小项目 冰炭不投de小计算器

一.前言

这是我首个使用java写的app,也在学习郭霖老师的第一行代码和李刚老师的疯狂java讲义之时,进行的练习之作,刚刚学习java和android,有些地方可能并没有做的很完善,希望大家可以多多包涵。

二.环境准备和所需知识点

1. 编译器:Andriod Studio
2. 新建一个项目并选择全部默认
3. 知识点:
  • 对Android界面和布局的了解
  • 对Android活动的了解
  • 对Java基础知识的了解(面向对象,集合)
  • 算法:中缀表达式转后缀表达式,后缀表达式计算结果

三.实现效果和界面,运行截图

1.实现效果:
  • 加减混合运算(浮点数)
  • 可带括号
  • 可保留上次计算结果
2.效果截图

这里写图片描述
这里写图片描述

四.界面的编写

1.布局
  • 我使用的是百分比布局,使用前在app/build.gradle文件中添加一条语句
compile 'com.android.support:percent:24.2.1'
  • 修改的地方:
    图片
  • 修改后,点击弹出了提醒语句中的 Sync Now
    这里写图片描述
2.关于颜色搭配,推荐一个网站网站地址
3.界面的编写
  1. 所使用的控件:TextView Buttom
  2. 修改Activity_main.xml文件代码,内容如下
<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/buttonEqual"
        android:text="="
        android:layout_alignParentRight="true"
        android:textSize="25sp"
        android:background="#FFFFCD"
        android:layout_alignParentBottom="true"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />

    <Button
        android:id="@+id/buttonAdd"
        android:text="+"
        android:layout_alignParentRight="true"
        android:textSize="25sp"
        android:background="#F0FFFF"
        android:layout_above="@id/buttonEqual"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/buttonSign"
        android:text="-"
        android:layout_alignParentRight="true"
        android:textSize="25sp"
        android:background="#F0FFFF"
        android:layout_above="@id/buttonAdd"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/buttonMul"
        android:text="×"
        android:textSize="25sp"
        android:background="#F0FFFF"
        android:layout_alignParentRight="true"
        android:layout_above="@id/buttonSign"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />

    <Button
        android:id="@+id/buttonDiv"
        android:text="÷"
        android:layout_alignParentRight="true"
        android:textSize="25sp"
        android:background="#F0FFFF"
        android:layout_above="@id/buttonMul"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />

    <Button
        android:id="@+id/buttonDot"
        android:text="."
        android:layout_alignParentBottom="true"
        android:textSize="25sp"
        android:background="#FFFAF0"
        android:layout_toLeftOf="@id/buttonDiv"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/button3"
        android:text="3"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@id/buttonDot"
        android:layout_toLeftOf="@id/buttonDiv"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/button6"
        android:text="6"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@+id/button3"
        android:layout_toLeftOf="@id/buttonDiv"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/button9"
        android:text="9"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@+id/button6"
        android:layout_toLeftOf="@id/buttonDiv"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/buttonBack"
        android:text="删除"
        android:textSize="23sp"
        android:background="#F5F5F5"
        android:layout_above="@+id/button9"
        android:layout_toLeftOf="@id/buttonDiv"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />

    <Button
        android:id="@+id/button0"
        android:text="0"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_alignParentBottom="true"
        android:layout_toLeftOf="@id/buttonDot"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/button2"
        android:text="2"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@id/button0"
        android:layout_toLeftOf="@id/button3"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/button5"
        android:text="5"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@+id/button2"
        android:layout_toLeftOf="@id/button6"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/button8"
        android:text="8"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@+id/button5"
        android:layout_toLeftOf="@id/button9"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/buttonRightBracket"
        android:text=")"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@+id/button8"
        android:layout_toLeftOf="@id/buttonBack"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />

    <Button
        android:id="@+id/buttonAC"
        android:text="AC"
        android:layout_alignParentBottom="true"
        android:textSize="25sp"
        android:background="#FFFAF0"
        android:layout_toLeftOf="@id/button0"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />

    <Button
        android:id="@+id/button1"
        android:text="1"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@id/button0"
        android:layout_toLeftOf="@id/button2"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/button4"
        android:text="4"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@+id/button1"
        android:layout_toLeftOf="@id/button5"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/button7"
        android:text="7"
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@+id/button4"
        android:layout_toLeftOf="@id/button8"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <Button
        android:id="@+id/buttonLeftBracket"
        android:text="("
        android:textSize="25sp"
        android:background="#F5F5F5"
        android:layout_above="@+id/button7"
        android:layout_toLeftOf="@id/buttonRightBracket"
        app:layout_widthPercent="25%"
        app:layout_heightPercent="15%"
        />
    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_widthPercent="100%"
        app:layout_heightPercent="25%"
        android:layout_above="@+id/buttonLeftBracket"
        android:background="#FFFAFA"
        android:gravity="bottom|right"
        android:text=""
        android:textColor="#292421"
        android:textSize="30dp"


        />



</android.support.percent.PercentRelativeLayout>
4.隐藏自带标题
  • 修改app/src/main/res/values/styles.xml文件 修改内容如下:
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

</resources>
5.修改app图标和名字
  • 修改名字
    修改app/src/main/res/values/Strings.xml文件 修改内容如下:
<resources>
    <string name="app_name">冰炭不投de小计算器</string>
</resources>
  • 修改图标
    1. 将图标放在pp/src/main/res/mipmap文件中
    2. 修改AndroidManifest.xml文件
android:allowBackup="true"
android:icon="@mipmap/图片名字" //修改这句
android:label="@string/app_name"

五.活动的编写

1. 思路
  • 为每个控件起相对应的名字和监控器,点击不同控件触发不同的事件
2. 计算器中应该考虑的异常,并禁止输入
  • 小数点不可在一个数字中多次出现
  • 除了*- 和/-之外 其他任意两个符号不可同时出现
  • 负号的处理,负号可以出现在首位,负号可以出现在*/后面
  • 右括号必须小于等于左括号的数量
  • 左括号前不能是数字,右括号后不能是数字
  • 等于时,左右括号数量必须相同,才能输出结果
  • 其他没有考虑到的错误,使用异常抛出错误
3.其他应该优化的地方
  • 除0
  • 已有符号时,再输入符号时,覆盖之前输入的符号
  • 保存上次计算结果
  • 删除键
  • 清屏键
4.修改MainAcitivy中的代码,内容如下
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView textView;
    private StringBuilder pending=new StringBuilder();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);


        textView = (TextView)findViewById(R.id.textView);//类似定义和赋值
        Button button0 = (Button)findViewById(R.id.button0);
        Button button1 = (Button)findViewById(R.id.button1);
        Button button2 = (Button)findViewById(R.id.button2);
        Button button3 = (Button)findViewById(R.id.button3);
        Button button4 = (Button)findViewById(R.id.button4);
        Button button5 = (Button)findViewById(R.id.button5);
        Button button6 = (Button)findViewById(R.id.button6);
        Button button7 = (Button)findViewById(R.id.button7);
        Button button8 = (Button)findViewById(R.id.button8);
        Button button9 = (Button)findViewById(R.id.button9);

        Button buttonAdd = (Button)findViewById(R.id.buttonAdd);
        Button buttonSign = (Button)findViewById(R.id.buttonSign);
        Button buttonMul = (Button)findViewById(R.id.buttonMul);
        Button buttonDiv = (Button)findViewById(R.id.buttonDiv);
        Button buttonEqual = (Button)findViewById(R.id.buttonEqual);
        Button buttonDot= (Button)findViewById(R.id.buttonDot);
        Button buttonRightBracket = (Button)findViewById(R.id.buttonRightBracket);
        Button buttonLeftBracket = (Button)findViewById(R.id.buttonLeftBracket);
        Button buttonBack = (Button)findViewById(R.id.buttonBack);
        Button buttonAC = (Button)findViewById(R.id.buttonAC);

        button0.setOnClickListener(this);//调用监听器
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);
        button4.setOnClickListener(this);
        button5.setOnClickListener(this);
        button6.setOnClickListener(this);
        button7.setOnClickListener(this);
        button8.setOnClickListener(this);
        button9.setOnClickListener(this);

        buttonAdd.setOnClickListener(this);
        buttonSign.setOnClickListener(this);
        buttonMul.setOnClickListener(this);
        buttonDiv.setOnClickListener(this);
        buttonEqual.setOnClickListener(this);
        buttonDot.setOnClickListener(this);
        buttonRightBracket.setOnClickListener(this);
        buttonLeftBracket.setOnClickListener(this);
        buttonBack.setOnClickListener(this);
        buttonAC.setOnClickListener(this);


    }
    @Override
    //监听器
    public void onClick(View v){
        //当前字符串的最后一个和倒数第二个
        int last = 0;
        int last_q =0;
        if(pending.length()!=0)
        {
            last = pending.codePointAt(pending.length()-1);
            if (pending.length()>1)
                last_q =pending.codePointAt(pending.length()-2);
        }
        switch (v.getId()) {
            case R.id.button0:
                if(last!=')'){
                    pending = pending.append("0");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"0");
                }
                textView.setText(pending);
                break;
            case R.id.button1:
                if(last!=')'){
                    pending = pending.append("1");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"1");
                }
                textView.setText(pending);
                break;
            case R.id.button2:
                if(last!=')'){
                    pending = pending.append("2");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"2");
                }
                textView.setText(pending);
                break;
            case R.id.button3:
                if(last!=')'){
                    pending = pending.append("3");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"3");
                }
                textView.setText(pending);
                break;
            case R.id.button4:
                if(last!=')'){
                    pending = pending.append("4");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"4");
                }
                textView.setText(pending);
                break;
            case R.id.button5:
                if(last!=')'){
                    pending = pending.append("5");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"5");
                }
                textView.setText(pending);
                break;
            case R.id.button6:
                if(last!=')'){
                    pending = pending.append("6");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"6");
                }
                textView.setText(pending);
                break;
            case R.id.button7:
                if(last!=')'){
                    pending = pending.append("7");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"7");
                }
                textView.setText(pending);
                break;
            case R.id.button8:
                if(last!=')'){
                    pending = pending.append("8");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"8");
                }
                textView.setText(pending);
                break;
            case R.id.button9:
                if(last!=')'){
                    pending = pending.append("9");
                }
                else {
                    pending = pending.replace(pending.length()-1,pending.length(),"9");
                }
                textView.setText(pending);
                break;
            case R.id.buttonAdd: // +加
                if(last>='0' &&last<='9' ||last==')') {
                    pending = pending.append("+");
                }
                else if(pending.length()>1&&last!='('){
                    pending = pending.replace(pending.length()-1,pending.length(),"+");
                }
                if(pending.length()>1&&last=='-'&&(last_q=='*'||last_q=='/')){
                    pending = pending.replace(pending.length()-2,pending.length(),"+");
                }
                textView.setText(pending);
                break;
            case R.id.buttonSign:// -减
                if(last>='0' &&last<='9' ||last==')'||last=='*'||last=='/'||pending.length()==0) {
                    pending = pending.append("-");
                }
                else  if(pending.length()>1&&last!='('){
                    pending = pending.replace(pending.length()-1,pending.length(),"-");
                }
                if(pending.length()>1&&last=='-'&&(last_q=='*'||last_q=='/')){
                    pending = pending.replace(pending.length()-2,pending.length(),"-");
                }
                textView.setText(pending);
                break;
            case R.id.buttonMul: // *乘
                if(last>='0' &&last<='9' ||last==')') {
                    pending = pending.append("*");
                }
                else if(pending.length()>1&&last!='(')
                {
                    pending = pending.replace(pending.length()-1,pending.length(),"*");
                }
                if(pending.length()>1&&last=='-'&&(last_q=='*'||last_q=='/')){
                    pending = pending.replace(pending.length()-2,pending.length(),"*");
                }
                textView.setText(pending);
                break;
            case R.id.buttonDiv: // /除
                if(last>='0' &&last<='9' ||last==')') {
                    pending = pending.append("/");
                }
                else if(pending.length()>1&&last!='('){
                    pending = pending.replace(pending.length()-1,pending.length(),"/");
                }
                if(last=='-'&&(last_q=='*'||last_q=='/')){
                    pending = pending.replace(pending.length()-2,pending.length(),"/");
                }
                textView.setText(pending);
                break;
            case R.id.buttonEqual: // =等于
                if((last>='0' &&last<='9' ||last==')')&&judje2()==0) {
                    InfixInToDuffix inf = new InfixInToDuffix();
                        String jieguo;
                        String a="0";
                    try {
                        a = inf.toSuffix(pending);
                        jieguo=inf.dealEquation(a);

                    }
                    catch (Exception ex){
                        jieguo = "出错";
                    }
                    textView.setText(pending+"="+jieguo);
                    pending = pending.delete(0, pending.length());
                    if(Character.isDigit(jieguo.charAt(0))) {
                        pending = pending.append(jieguo);
                    }
                }
                break;
            case R.id.buttonDot:// 。小数点
                if(last>='0' &&last<='9'&&judje1()) {
                    pending = pending.append(".");
                    textView.setText(pending);
                }
                break;
            case R.id.buttonRightBracket:// )右括号
                if((last>='0' &&last<='9'||last==')')&&judje2()==1) {
                    pending = pending.append(")");
                    textView.setText(pending);
                }
                break;
            case R.id.buttonLeftBracket:// (左括号
                if((last<'0' ||last>'9')&&last!='.'&&last!=')') {
                    pending = pending.append("(");
                    textView.setText(pending);
                }
                break;
            case R.id.buttonBack: //删除
                if(pending.length()!=0) {
                    pending = pending.delete(pending.length()-1,pending.length());
                    textView.setText(pending);
                }
                break;
            case R.id.buttonAC: //清空
                    pending = pending.delete(0, pending.length());
                    textView.setText(pending);
                break;
            default:
                break;
        }
    }
    private boolean judje1(){
        String a="+-*/().";
        int[] b = new int[a.length()];
        int max;
        for (int i = 0;i < a.length();i++ )
        {
            String c =""+a.charAt(i);
            b[i] = pending.lastIndexOf(c);
        }
        Arrays.sort(b);
        if(b[a.length()-1]==-1){
            max = 0;
        }
        else{
            max = b[a.length()-1];
        }
        if(pending.indexOf(".",max)==-1){
            return true;
        }
        else{
            return false;}
    }
    private int judje2(){
        int a=0,b=0;
        for(int i = 0 ; i < pending.length() ;i++){
            if(pending.charAt(i)=='(' ) {
                a++;
            }
            if(pending.charAt(i)==')' ) {
                b++;
            }
        }
        if(a == b)
            return 0;
        if(a > b)
            return 1;
        return 2;
    }

}

六.算法部分

1. 后缀表达式是什么和计算:链接
2. 中缀缀表达式(常见的表达式)转换成后缀表达式的方法:链接
3.在项目中新建一个InfixInToDuffix的java文件编写代码,如下
public class InfixInToDuffix {

    //使用集合定义好符号的运算优先级别
    private static final Map<Character,Integer>basic =new HashMap<Character, Integer>();
    static {
        basic.put('-',1);
        basic.put('+', 1);
        basic.put('*', 2);
        basic.put('/', 2);
        basic.put('(', 0);//在运算中  ()的优先级最高,但是此处因程序中需要 故设置为0
    }


    //将中缀表达式转换为后缀表达式
    public String toSuffix(StringBuilder infix){
        List<String> queue = new ArrayList<String>();                                    //定义队列  用于存储 数字  以及最后的  后缀表达式
        List<Character> stack = new ArrayList<Character>();                             //定义栈    用于存储  运算符  最后stack中会被 弹空

        char[] charArr = infix.substring(0,infix.length()).trim().toCharArray();                                    //字符数组  用于拆分数字或符号
        String standard = "*/+-()";                                                        //判定标准 将表达式中会出现的运算符写出来
        char ch = '&';                                                                    //在循环中用来保存 字符数组的当前循环变量的  这里仅仅是初始化一个值  没有意义
        int len = 0;                                                                 //用于记录字符长度 【例如100*2,则记录的len为3 到时候截取字符串的前三位就是数字】
        for (int i = 0; i < charArr.length; i++) {//开始迭代
            int last=0;
            if(i>0) {
                 last = charArr[i-1];
            }
            ch = charArr[i];                                                            //保存当前迭代变量
            if(Character.isDigit(ch)) {                                                    //如果当前变量为 数字
                len++;
            }else if(ch == '.'){                                                        //如果当前变量为  .  会出现在小数里面
                len++;
            }else if(ch == '-' && (last =='*'||last=='/'||i==0)){                                                        //如果当前变量为  .  会出现在小数里面
                len++;
                continue;
            }else if(standard.indexOf(ch) != -1) {                                        //如果是上面标准中的 任意一个符号
                if(len > 0) {                                                            //长度也有
                    queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len, i)));    //说明符号之前的可以截取下来做数字
                    len = 0;                                                            //长度置空
                }
                if(ch == '(') {                                                            //如果是左括号
                    stack.add(ch);                                                        //将左括号 放入栈中
                    continue;                                                            //跳出本次循环  继续找下一个位置
                }

                if (!stack.isEmpty()) {                                                    //如果栈不为empty
                    int size = stack.size() - 1;                                        //获取栈的大小-1  即代表栈最后一个元素的下标
                    boolean flag = false;                                                //设置标志位
                    while (size >= 0 && ch == ')' && stack.get(size) != '(') {            //若当前ch为右括号,则 栈里元素从栈顶一直弹出,直到弹出到 左括号
                        queue.add(String.valueOf(stack.remove(size)));                    //注意此处条件:ch并未入栈,所以并未插入队列中;同样直到找到左括号的时候,循环结束了,所以左括号也不会放入队列中【也就是:后缀表达式中不会出现括号】
                        size--;                                                            //size-- 保证下标永远在栈最后一个元素【栈中概念:指针永远指在栈顶元素】
                        flag = true;                                                    //设置标志位为true  表明一直在取()中的元素
                    }
                    if(ch==')'&&stack.get(size) == '('){
                        flag = true;
                    }
                    while (size >= 0 && !flag && basic.get(stack.get(size)) >= basic.get(ch)) {    //若取得不是()内的元素,并且当前栈顶元素的优先级>=对比元素 那就出栈插入队列
                        queue.add(String.valueOf(stack.remove(size)));                    //同样  此处也是remove()方法,既能得到要获取的元素,也能将栈中元素移除掉
                        size--;
                    }
                }
                if(ch != ')') {                                                            //若当前元素不是右括号
                    stack.add(ch);                                                        //就要保证这个符号 入栈
                } else {                                                                //否则就要出栈 栈内符号
                    stack.remove(stack.size() - 1);
                }
            }
            if(i == charArr.length - 1) {                                                //如果已经走到了  中缀表达式的最后一位
                if(len > 0) {                                                            //如果len>0  就截取数字
                    queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len+1, i+1)));
                }
                int size = stack.size() - 1;                                            //size表示栈内最后一个元素下标
                while (size >= 0) {                                                        //一直将栈内  符号全部出栈 并且加入队列中  【最终的后缀表达式是存放在队列中的,而栈内最后会被弹空】
                    queue.add(String.valueOf(stack.remove(size)));
                    size--;
                }
            }

        }
        String a = queue.toString();
        return a.substring(1,a.length()-1);
    }


    public String dealEquation(String equation){

        String [] arr = equation.split(", ");                                    //根据, 拆分字符串
        List<String> list = new ArrayList<String>();                            //用于计算时  存储运算过程的集合【例如list中当前放置  100   20  5  /  则取出20/5 最终将结果4存入list   此时list中结果为  100  4 】


        for (int i = 0; i < arr.length; i++) {                                    //此处就是上面说的运算过程, 因为list.remove的缘故,所以取出最后一个数个最后两个数  都是size-2
            int size = list.size();
            switch (arr[i]) {
                case "+": double a = Double.parseDouble(list.remove(size-2))+ Double.parseDouble(list.remove(size-2)); list.add(String.valueOf(a));     break;
                case "-": double b = Double.parseDouble(list.remove(size-2))- Double.parseDouble(list.remove(size-2)); list.add(String.valueOf(b));     break;
                case "*": double c = Double.parseDouble(list.remove(size-2))* Double.parseDouble(list.remove(size-2)); list.add(String.valueOf(c));     break;
                case "/": double d = Double.parseDouble(list.remove(size-2))/ Double.parseDouble(list.remove(size-2)); list.add(String.valueOf(d));       break;
                default: list.add(arr[i]);     break;                                    //如果是数字  直接放进list中
            }
        }

        return list.size() == 1 ? list.get(0) : "运算失败" ;                    //最终list中仅有一个结果,否则就是算错了
    }

}

七 更新优化

在之后的陆续测试中,由学长发现其中的不足之处,对于浮点数的计算,容易发生精度丢失,比如说3*1.3=3.900000000000000000001,对于这种情况我使用了BigDecimal类对运算进行了改进。更改后代码如下(只更改了InfixInToDuffix类下的dealEquation方法)

public String dealEquation(String equation){

        String [] arr = equation.split(", ");                                    //根据, 拆分字符串
        List<String> list = new ArrayList<String>();                            //用于计算时  存储运算过程的集合【例如list中当前放置  100   20  5  /  则取出20/5 最终将结果4存入list   此时list中结果为  100  4 】


        for (int i = 0; i < arr.length; i++) {                                    //此处就是上面说的运算过程, 因为list.remove的缘故,所以取出最后一个数个最后两个数  都是size-2
            int size = list.size();
            switch (arr[i]) {
                case "+": BigDecimal a = new BigDecimal(list.remove(size-2)).add(new BigDecimal(list.remove(size-2))); list.add(String.valueOf(a));     break;
                case "-": BigDecimal b = new BigDecimal(list.remove(size-2)).subtract(new BigDecimal(list.remove(size-2))); list.add(String.valueOf(b));     break;
                case "*": BigDecimal c = new BigDecimal(list.remove(size-2)).multiply(new BigDecimal(list.remove(size-2))); list.add(String.valueOf(c));     break;
                case "/": BigDecimal d = new BigDecimal(list.remove(size-2)).divide(new BigDecimal(list.remove(size-2)),10,BigDecimal.ROUND_HALF_UP); list.add(String.valueOf(d));       break;
                default: list.add(arr[i]);     break;                                    //如果是数字  直接放进list中
            }
        }

        return list.size() == 1 ? list.get(0) : "运算失败" ;                    //最终list中仅有一个结果,否则就是算错了
    }
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值