【问题标题】:Pulling the third number out of a a + b + c = d string从 a + b + c = d 字符串中拉出第三个数字
【发布时间】:2013-11-26 22:37:20
【问题描述】:

我的意思是,如果我有一个字符串,例如 23 + 4 + 13 = 40123 - 100 + 245 = 268,我将如何从字符串中取出第三 (c) 部分?在示例的情况下,我想使用 13245

我该怎么做呢?

这是我目前获得第一个数字、运算符、第二个数字和问题答案的代码,但我不确定如何获得第三个数字。

int first = Integer.parseInt(fileContent.substring(0, fileContent.indexOf(" ")));
char operator = getOperator(fileContent);
int second = secondNumber(result, fileContent);
int last = Integer.parseInt(result.substring(result.indexOf("=") + 1));

我不能为此使用数组、正则表达式、try/catch 或 systemTokenizers。

更新:这是一个我必须做的实验室,但我不能使用任何这些东西,因为它是一个“入门”课程,我们还不应该知道它们。很不方便。

这是我的 getOperator 方法

public static char getOperator(String fileContent){


    int checkAdd = fileContent.indexOf('+');
    int checkMinus = fileContent.indexOf('-');
    int checkMulti = fileContent.indexOf('*');
    int checkDivi = fileContent.indexOf('/');

    if (checkAdd != -1){
        char operator = fileContent.charAt(fileContent.indexOf('+')); 
        return operator;
    }   
    else if (checkMinus != -1) {
       char operator = fileContent.charAt(fileContent.indexOf('-'));
       return operator;
    }
    else if (checkMulti != -1) {
        char operator = fileContent.charAt(fileContent.indexOf('*'));
        return operator;
    }
    else if (checkDivi != -1){
        char operator = fileContent.charAt(fileContent.indexOf('/'));
        return operator;
    }
    return ' ';

这是我的 secondNumber 方法:

public static double secondNumber(String result, String opContent){

    int checkAdd = opContent.indexOf('+');
    int checkMinus = opContent.indexOf('-');
    int checkMulti = opContent.indexOf('*');
    int checkDivi = opContent.indexOf('/');

    if (checkAdd != -1){
        return Double.parseDouble(result.substring(result.indexOf('+')+1 , result.indexOf('='))); 
    }   
    else if (checkMinus != -1) {
        return Double.parseDouble(result.substring(result.indexOf('-')+1 , result.indexOf('='))); 
    }
    else if (checkMulti != -1) {
        return Double.parseDouble(result.substring(result.indexOf('*')+1 , result.indexOf('='))); 
    }
    else if (checkDivi != -1){
        return Double.parseDouble(result.substring(result.indexOf('/')+1 , result.indexOf('='))); 
    }
    return 0;   
}

结果来自这个方法:

public static String removeSpaces(String content){
    String result = content.replace(" ","");
    return result;
}

【问题讨论】:

  • 你能用Scanner吗?
  • 您是否有一个包含所有可能运算符的有限列表(例如 +、-、/、* 等)?如果是,您可以使用正则表达式通过有限的运算符列表将字符串分隔为数组(列表)
  • 为什么不能使用正则表达式或分词器?这是作业吗?
  • 既然你有第一个、第二个数字和第一个运算符,请将第一个出现的两者都替换为 "",然后你一次又一次地使用 getOperator Integer.parseInt(fileContent.substring(0, fileContent.indexOf(" ")));
  • 问题实际上出在正在扫描的文件中,因此它们并不是真正静态的。

标签: java string math numbers


【解决方案1】:

执行此操作的一个好方法(在您的限制范围内)是使用带有 fromIndexString.indexOf overload,以及执行类似操作的方法,但对于操作员:

public static int getNextOperatorIndex(String fileContent, int startIndex)
{
    for (int i = startIndex; i < fileContent.length(); i++)
    {
        if (fileContent.charAt(i) == '+' ||
            fileContent.charAt(i) == '-' ||
            fileContent.charAt(i) == '*' ||
            fileContent.charAt(i) == '/')
            return i;
    }
    return -1;
}

通过这两种方法,您可以获得拆分字符串的索引:

int firstOperatorIndex = getNextOperatorIndex(fileContent, 0);
int secondOperatorIndex = getNextOperatorIndex(fileContent,firstOperatorIndex+1);
int equalsIndex = fileContent.indexOf("=", secondOperatorIndex);

由于这是作业,我将把最后一部分留给你:

//TODO: get a, b, c, d, and both operators based on those indexes

您可以使用String.trim()replace(例如fileContent = fileContent.replace(" ", "");)更轻松地消除空白。

【讨论】:

  • 我还有一个问题。有没有办法可以检查是否有第二个运算符,以便我可以在两个 (a+b=c) 和三个(a+b-c=d) 问题之间进行处理?
  • 是的,如果secondOperatorIndex-1,那么就没有第二个运算符了。
【解决方案2】:

这个问题有 3 个部分:分词、语义类型和选择。标记化或词法分析将单个字符收集到有意义的组中:问题中的空格、数字和运算符。语义类型将标记识别为表达式的有意义元素。将数字串转换为数字,确定具体操作。如果您正在编写表达式编译器,这些将进入您的抽象语法树 (AST),但您的问题是找到(选择)第三个数字元素。

要解决,实施每个部分。标记器将遍历您的源字符串并返回标记。您想要的是一个将输入字符串作为构造函数参数的类,并且有一个方法可以在每次调用时返回下一个标记。这就是 java 标记器提供的功能。

类型识别器将接收一个令牌并返回一个容器类,其中包含令牌的类型及其值。在 AST 中,这称为节点。如果节点是一个数字,它包含整数值。如果是操作符,则值应该是标识操作的枚举。

将其输入到找到第三个数字节点的类中。

鉴于实施方面的限制,这听起来像是功课。这里有足够的内容可以帮助您入门。如果不是家庭作业,请解释限制措施的原因。

有一个很棒的工具叫做 ANTLR 可以解决这类问题。它是一个解析器生成器,并根据语法创建词法和语义分析器。如果你必须做很多这样的挑战,那是值得知道的。

【讨论】:

    【解决方案3】:

    这做了很多假设,第一,你可以实现自己的“Tokenizer”,第二,如果你调用nextInt(),下一个token必须是一个int。它做你想做的事,玩得开心,调试,看看它是如何工作的,理解算法。

    public static class PoorManTokenizer {
    
        private String content;
    
        public PoorManTokenizer(String fileContent) {
            this.content = fileContent.trim();
        }
    
        public char nextChar() {
            return next().charAt(0);
        }
    
        public int nextInt() {
            return Integer.parseInt(next());
        }
    
        private String next() {
            int indexOf = content.indexOf(" ");
            if (indexOf == -1) {
                indexOf = content.length();
            }
            String substring = content.substring(0, indexOf);
            content = content.substring(substring.length()).trim();
            return substring;
        }
    }
    
    public static void main(String[] args) {
    
        String fileContent = "23 + 4 + 13 = 40";
    
        PoorManTokenizer poorManTokenizer = new PoorManTokenizer(fileContent);
    
        int firstNumber = poorManTokenizer.nextInt();
        char firstOperator = poorManTokenizer.nextChar();
        int secondNumber = poorManTokenizer.nextInt();
        char secondOperator = poorManTokenizer.nextChar();
        int thirdNumber = poorManTokenizer.nextInt();
        char thirdOperator = poorManTokenizer.nextChar();
        int lastNumber = poorManTokenizer.nextInt();
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多