首页 > 解决方案 > 有没有一种方法可以比较java中不同长度的字符串?

问题描述

也许我的问题与消息的内容不匹配,但我希望我能很好地解释我的问题。

我有两种情况

第一个场景:

如果我收到这样的字符串:

x = x + 10;x = x + a [i]; x = x + a [i] +10;

注意:这里的字母可能不同,示例也可能不同。我将 = 符号之前的一侧与 = 符号之后的一侧分开 所以我得到了 ArrayList ,其中元素如下所示:

我现在想在句子之间进行比较,所以我将在索引 0 和索引 1 之间以及索引 2 和索引 3 之间进行比较,等等。

让我们将等号之前的一侧(左侧)命名为 str1,将等号之后的一侧(右侧)命名为 str2

是否有可能在两侧进行比较,并说如果 str1 是变量,而 str2 两个是同一个变量的名称,并且数组位于变量名称之后,如下例所示:

x = x + a[i] * 10;

我们返回假。但是,如果变量的名称彼此不同,我们将返回 true,如下例所示:

x = y + a[i] + 10;

所以 false 将返回类似于此的内容:

x = x + a[i];

或者

x = x + a[i] + 10;

注意:字母可能不同。我的意思是我们可以有这样的东西:

sum = sum + a[i]; and so on.

第二种情况:

注意:字母和数字可以更改。

如果我有如下字符串:

a [i] = b [i] + c [i];

或者

a [i] = b [i + 1] * c [i] +10;

我能够以与我之前提到的相同的方式将 = 之前的一侧和 = 之后的一侧分开,它看起来像这样:

这里的问题是:

我也可以将左侧彼此分开吗?我的意思是,我希望第一句话是这样的

关于第二个示例的相同内容,因为我想像这样进行比较: a [i] 与 b [i]

并将 a [i] 与 c [i] 进行比较

我试过的:

我使用“;”分割字符串 然后我像上面提到的那样将两边分开,我使用了 charAT 但我不知道如何找出语句的其余部分,就像在这个例子中一样:x = x + a[i]; 它将返回 1 因为 x = x 但我不知道如何检查字符串的其余部分,以及我如何分隔字符串更像这个例子:a[i] = b[i] + c[i+1 ];

先感谢您

标签: javaarraysstringsplitcomparison

解决方案


听起来您想正确解析“计算器”字符串。假设这是您的字符串:

x = x + a[i] * (10 + 2)

您希望将其解析为抽象语法树

   -- = --
  /       \
 x       - + -
        /     \
     -- * --   x
    /       \
   +        []
  / \      /  \
 10  2    a    i

请注意,例如,此语法树如何处理事物以使 a*优先(我们先做a[i] * (10 + 2),然后才将最终结果添加到 x,这与x + a[i]首先做的事情不同,然后乘以它。之后全部,1 + 2 * 3如果你只是从左到右阅读,是 9,但如果你应用标准的算术优先规则,则为 7。我假设你想要那些。

此外,此示例还包括括号,这是另一种常用工具。

一旦你有了这样一棵树,使用递归算法解决整个事情就非常简单了,就像分析你所要求的那样。

所以,你的问题真的归结为:

如何将这样的字符串翻译成这些 AST 事物之一?

答案是:嗯,它比你想象的要复杂。但这是一个已解决的问题 - 有大量的 java 解析器生成器可用。在网上搜索“将计算器字符串转换为树解析器 java”,例如可以让您找到这个 SO 答案

是的,树是有些复杂的构造,但是,正如我所说,那是因为这个概念从根本上来说有点复杂,优先级等等。


推荐阅读