Android学习日志(三)

一、计算器的逻辑代码

不带""( "")"的逻辑代码:

package com.example.zwkkkk1.caculator1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import java.math.BigDecimal;
import java.util.Stack;
import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static String TAG = "CACULATOR";
    TextView txt_result, txt_edit;
    boolean isOperateDown = false;//运算符是否已经按过一次,默认没有按过 false
    boolean isDotDown = false;//. 是否已经按过一次,默认没有按过 false
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txt_edit = (TextView)findViewById(R.id.txt_edit);
        txt_result = (TextView)findViewById(R.id.txt_result);

        findViewById(R.id.btn_0).setOnClickListener(this);
        findViewById(R.id.btn_1).setOnClickListener(this);
        findViewById(R.id.btn_2).setOnClickListener(this);
        findViewById(R.id.btn_3).setOnClickListener(this);
        findViewById(R.id.btn_4).setOnClickListener(this);
        findViewById(R.id.btn_5).setOnClickListener(this);
        findViewById(R.id.btn_6).setOnClickListener(this);
        findViewById(R.id.btn_7).setOnClickListener(this);
        findViewById(R.id.btn_8).setOnClickListener(this);
        findViewById(R.id.btn_9).setOnClickListener(this);
        findViewById(R.id.btn_divide).setOnClickListener(this);
        findViewById(R.id.btn_multi).setOnClickListener(this);
        findViewById(R.id.btn_plus).setOnClickListener(this);
        findViewById(R.id.btn_sub).setOnClickListener(this);
        findViewById(R.id.btn_equal).setOnClickListener(this);
        findViewById(R.id.btn_clear).setOnClickListener(this);
        findViewById(R.id.btn_back).setOnClickListener(this);
        findViewById(R.id.btn_equal).setOnClickListener(this);
        findViewById(R.id.btn_dot).setOnClickListener(this);
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_0:
                num_down("0");break;
            case R.id.btn_1:
                num_down("1");break;
            case R.id.btn_2:
                num_down("2");break;
            case R.id.btn_3:
                num_down("3");break;
            case R.id.btn_4:
                num_down("4");break;
            case R.id.btn_5:
                num_down("5");break;
            case R.id.btn_6:
                num_down("6");break;
            case R.id.btn_7:
                num_down("7");break;
            case R.id.btn_8:
                num_down("8");break;
            case R.id.btn_9:
                num_down("9");break;
            case R.id.btn_plus:
                operator_down("+");break;
            case R.id.btn_sub:
                operator_down("-");break;
            case R.id.btn_divide:
                operator_down("÷");break;
            case R.id.btn_multi:
                operator_down("×");break;
            case R.id.btn_clear:
                isDotDown = false;
                isOperateDown = false;
                txt_edit.setText("0");
                txt_result.setText("");
                break;
            case R.id.btn_back: {
                String strEdit = txt_edit.getText().toString();
                int length = strEdit.length();
                if (Pattern.matches("^=[0-9].*", strEdit)) {
                    txt_edit.setText("0");
                    txt_result.setText("");
                } else {
                    if (length > 0) {
                        String word = strEdit.substring(length - 1, length);
                        if(word.equals("."))
                            isDotDown = false;
                        if(word.equals("+") || word.equals("-") || word.equals("×") || word.equals("÷"))
                            isOperateDown = false;
                        txt_edit.setText(strEdit.substring(0, length - 1));
                    }
                }
                break;
            }
            case R.id.btn_dot: {
                String strEdit = txt_edit.getText().toString();
                if (!isDotDown) {
                    isDotDown = true;
                    if(Pattern.matches("^=[0-9].*", strEdit))
                        strEdit = "0";
                    txt_edit.setText(strEdit + ".");
                }
                break;
            }
            case R.id.btn_equal:
                equal();break;
        }
    }

    //按下数字函数
    private void num_down(String num) {
        String strEdit = txt_edit.getText().toString();
        isOperateDown = false;

        if (strEdit.equals("0") || Pattern.matches("^=[0-9].*", strEdit)) {
            txt_edit.setText(num);
            txt_result.setText("");
        } else {
            txt_edit.setText(strEdit + num);
        }
    }

    // 按下运算符函数
    private void operator_down(String operator) {
        if(!isOperateDown) {
            String strEdit = txt_edit.getText().toString();
            isOperateDown = true;
            isDotDown = false;
            if(Pattern.matches("^=[0-9].*", strEdit))
                strEdit = strEdit.substring(1, strEdit.length());
            txt_edit.setText(strEdit + operator);
        }
    }

    private void equal() {
        String strEdit = txt_edit.getText().toString();
        int length = strEdit.length();
        if(!Pattern.matches("^=[0-9].*", strEdit))
        {
            txt_result.setText(strEdit);
            if(Pattern.matches(".*[\\+\\-\\×\\÷\\.]$", strEdit)) {
                strEdit = strEdit.substring(0, length - 1);
            }
            String postfixExp = getPostfixExp(strEdit);
            txt_edit.setText("=" + calPostfix(postfixExp));
        }
    }


    //将中缀表达式转换为后缀表达式
    private String getPostfixExp(String str) {
        String postfix = "";
        String numString = "";   //因数字 不止一位需要String存储
        Stack numStack = new Stack();
        Stack opStack = new Stack();
        for(int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if(Character.isDigit(ch) || ch == '.') {    //判定ch 是否是数字 或者是 .
                numString += String.valueOf(ch);        //将数字和 .放入numString,等待下一个运算符
            } else {    //ch为运算符时
                if(numString.length() > 0) {
                    numStack.push(numString);//将此运算符前数字压入数字栈
                    numString = "";         //压入栈后,初始化 numString
                }
                opPush(opStack, numStack, ch);
            }
        }

        //最后判定numString是否为空,因为最后一个可能是数字,没有运算符进行判定
        if(numString.length() > 0)
            numStack.push(numString);

        //检测完后,将运算符栈中转入到数字栈中
        while(!opStack.empty()) {
            numStack.push(opStack.pop());
        }
        //将数字栈打印出来得到后缀表达式
        //此处需要将字符串逆序,才得到后缀表达式,但是有小数点的存在,不能直接用 reverse 的逆序函数
        //通过两个栈的先进后出特点,得到栈的逆序
        while(!numStack.empty()) {
            opStack.push(numStack.pop());
        }
        while(!opStack.empty()) {
            postfix = postfix + String.valueOf(opStack.pop()) + " ";
        }
        return postfix;
    }

    //计算后缀表达式
    private String calPostfix(String str) {
        String result = "";
        Stack numStack = new Stack();
        for(int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if(ch == ' ') {
                //运算符时
                if(result.length() > 0 && (result.equals("+") || result.equals("-") || result.equals("×") || result.equals("÷")))
                {
                    double num = 0;
                    double secondNum = Double.parseDouble(String.valueOf(numStack.pop()));
                    double firstNum = Double.parseDouble(String.valueOf(numStack.pop()));
                    switch (result) {
                        case "+":
                            num = firstNum + secondNum;break;
                        case "-":
                            num = firstNum - secondNum;break;
                        case "×":
                            num = firstNum * secondNum;break;
                        case "÷":
                            num = firstNum / secondNum;break;
                    }
                    numStack.push(num);
                }
                else if(result.length() > 0) {
                    numStack.push(result);
                }
                result = "";
            } else {
                result += String.valueOf(ch);
            }
        }
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(numStack.pop()))).stripTrailingZeros().toPlainString();
    }
    //获取运算符权重
    private int getOpWeight(char ch) {
        // + - 权重为1
        if(ch == '+' || ch == '-') return 1;
        //× ÷ 权重为2
        if(ch == '×' || ch == '÷') return 4;
        return -1;
    }

    //将运算符压入栈
    private void opPush(Stack opStack, Stack numStack, char ch) {
        if(canOpPush(opStack, ch)) {    //判定能否将运算符压入栈内
            opStack.push(ch);           //true则压入栈内
        } else {                        //false(即 待压入运算符优先级 <= 栈顶运算符优先级)
            //将栈顶运算符取出压入数字栈
            numStack.push(String.valueOf(opStack.pop()));
            //此处需要递归判定,弹出所有优先级 >= 该运算符的栈顶元素
            opPush(opStack, numStack, ch);
        }
    }

    //判定运算符能否压入运算符栈
    private Boolean canOpPush(Stack opStack, char ch) {
        //当运算符栈为空时,返回true;或当待压入运算符权重大于栈顶权重,返回true
        if(opStack.empty() || (getOpWeight(ch) > getOpWeight(String.valueOf(opStack.peek()).charAt(0))))
            return true;

        return false;           //其他情况返回false
    }
}

解析:

1.equal:等于(=)的方法;

2.word.equals()与括号内的相等则输出1;  

3.Pattern.matches("^=[0-9].*", strEdit)

a. matches() 方法用于检测字符串是否匹配给定的正则表达式。

调用此方法的 str.matches(regex) 形式与以下表达式产生的结果完全相同:

Pattern.matches(regex, str)
b.   
正则表达式描述

this is text

匹配字符串 "this is text"

this\s+is\s+text

注意字符串中的 \s+

匹配单词 "this" 后面的 \s+ 可以匹配多个空格,之后匹配 is 字符串,再之后 \s+ 匹配多个空格然后再跟上 text 字符串。

可以匹配这个实例:this is text

^\d+(\.\d+)?

^ 定义了以什么开始

\d+ 匹配一个或多个数字

? 设置括号内的选项是可选的

\. 匹配 "."

可以匹配的实例:"5", "1.5" 和 "2.21"。

 

4.getText().toString();

EditText中的getText()方法的返回值为CharSequence,如果我们想要获得string类型数据的话,需要在后边加上.toString

5.substring()提出子串

6.isDigit() ;digit:数字,判断是否是数字。

7.正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。

8.

中缀表达式

(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。

前缀表达式(例:+ 3 4)或后缀表达式(例:3 4 +)相比,中缀表达式不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。

与前缀或后缀记法不同的是,中缀记法中括号是必需的。计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。

9.运用后缀表达式进行计算的具体做法:

建立一个栈S 。从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项按操作数运算,再将运算的结果代替原栈顶的n项,压入栈S中 。如果后缀表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束。

总结:关于栈的运用还是有点迷,valueOf ()的功能也不能很好地理解。

二、ListView

1.简单应用

数组中数据是无法直接传递给ListView的,需要适配器来完成。ArrayAdapter通过泛型来指定要适配的数据类型,如:<String>,也可以自己配置类型,如 <Fruit>。

ArrayAdapter的构造函数依次传入当前上下文、ListView子项布局的id,以及要适配的数据。

eg:ArrayAdapter<String>adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,data);

ListView listView = (ListView)findViewById(R.id.list_view);

listView.setAdapter(adapter);

2.定制ListView的界面

定义一个实体类,作为ListView适配器的适配类型,如:Fruit,

然后需要为ListView的子项指定一个我们自定义的布局,在layout目录下新建fruit_item.xml,

接下来要创造一个自定义的适配器,继承自ArrayAdapter,并将泛型制定为Fruit。

a.   getView()在每个子项被滚动到屏幕内的时候会被调用。

b.在getView()的方法中,首先通过getItem()方法得到当前项的Fruit实例,然后使用LayoutInflater来为这个子项加载我们传入的布局

然后调用View的findViewById()方法分别获取到ImageView和TextView的实例,分别调用它们的setImageResource()和setText()方法来设置图片和文字最后将布局返回,自定义的适配器就完成了。

三、其他

1.框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法

2.不要重复造轮子hhh

2.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值