atoi函数Java实现(未参考任何代码,纯粹自己写着玩)

首先得有两个枚举类,用于枚举数字和符号

 private enum Number{
        ZERO(0, "0"), ONE(1, "1"), TOW(2, "2"),
        THREE(3, "3"), FOUR(4, "4"),
        FIVE(5, "5"), SIX(6, "6"),
        SEVEN(7, "7"), EIGHT(8, "8"), NINE(9, "9");
        private int number;
        private String numberString;
        private Number(int number, String numberString){
            this.number = number;
            this.numberString = numberString;
        }

        public String getNumberString() {
            return numberString;
        }

        public int getNumber() {
            return number;
        }
    }

private enum Symbol{

        PLUS("+"), DECREASE("-");

        private Symbol(String symbol){
            this.symbol = symbol;
        }
        private String symbol;

        public String getSymbol() {
            return symbol;
        }
    }

 然后为具体实现逻辑:分为三部分(头部符号检测、数值部分截取、字符转换为数字)

private static int atoi(String numberString){
        if (numberString == null || numberString.equals(""))
            return 0;

        // check 开头部分是否合理
        HashMap<Symbol, String> ret = consumeHead(numberString);
        // 符号不正确
        if (ret.isEmpty()){
            return 0;
        }
        AtomicReference<Symbol> symbol = new AtomicReference<>();
        AtomicReference<String> nextNumberString = new AtomicReference<>();
        ret.forEach((k, v) ->{
           symbol.set(k);
           nextNumberString.set(v);
        });
        // 逐一check ascii码
        String body = consumeBody(nextNumberString.get());
        return parseInt(body, symbol.get());
    }

    private static int parseInt(String number, Symbol symbol) {

        if (symbol.getSymbol().equals(Symbol.DECREASE.getSymbol()))
            return -getBaseInt(number);
        else
            return getBaseInt(number);

    }

    private static int getBaseInt(String number){
        int c = 0;
        long ret = 0;
        while (c != number.length()){
            String s = number.substring(c, c + 1);
            for (Number value : Number.values()) {
                if (value.getNumberString().equals(s)){
                    if (ret <= Integer.MAX_VALUE){
                        if (c != 0)
                            ret = ret * 10 + value.getNumber();
                        else
                            ret = value.getNumber();
                    }else{
                        return Integer.MAX_VALUE;
                    }
                }
            }
            c++;
        }
        return ret > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)ret;
    }

    private static String consumeBody(String number) {

        int forSub = 0;
        for (int i = 0; i < number.length(); i++){
            if (number.charAt(i) >= 48 && number.charAt(i) <= 57){
                forSub ++;
            }else
                break;
        }
        return number.substring(0, forSub);
    }

    private static HashMap<Symbol, String> consumeHead(String number) {
        HashMap<Symbol, String> map = new HashMap<>();
        int sym = -1;
        for (int i = 0; i < number.length(); i++){
            if (number.charAt(i) == 32){
                int j = i + 1;
                while (j < number.length()){
                    if (number.charAt(j) != 32)
                        break;
                    j++;
                }
                if (i == number.length())
                    break;
                i = j;
            }

            // 第一个字符为符号
            if (number.charAt(i) == 43 || number.charAt(i) == 45){
                sym = i;
                break;
            }

            // 第一个字符为数字
            if (! (number.charAt(i) >= 48 && number.charAt(i) <= 57)){
                break;
            }else {
                sym = i;
                break;
            }
        }

        if (sym != -1){

            if (number.charAt(sym) == 45)
                map.put(Symbol.DECREASE, number.substring(sym + 1));
            else if (number.charAt(sym) == 43)
                map.put(Symbol.PLUS, number.substring(sym + 1));
            else
                map.put(Symbol.PLUS, number.substring(sym));
        }

        return map;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值