java - 有没有一种方法可以比较java中不同长度的字符串?
问题描述
也许我的问题与消息的内容不匹配,但我希望我能很好地解释我的问题。
我有两种情况
第一个场景:
如果我收到这样的字符串:
x = x + 10;x = x + a [i]; x = x + a [i] +10;
注意:这里的字母可能不同,示例也可能不同。我将 = 符号之前的一侧与 = 符号之后的一侧分开 所以我得到了 ArrayList ,其中元素如下所示:
- 索引 0 -> x
- 索引 1 -> x + 10
- 索引 2 -> x
- 索引 3 -> a [i]
- 索引 4 -> x
- 索引 5 -> x + a [i] +10
我现在想在句子之间进行比较,所以我将在索引 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;
我能够以与我之前提到的相同的方式将 = 之前的一侧和 = 之后的一侧分开,它看起来像这样:
- 索引 0 -> a [i]
- 索引 1 -> b [i] + c [i]
- 索引 2 -> a [i]
- 索引 3 -> b [i + 1] * c [i] +10
这里的问题是:
我也可以将左侧彼此分开吗?我的意思是,我希望第一句话是这样的
- a [i] 本身
- b [i] 本身
- c [i] 本身
关于第二个示例的相同内容,因为我想像这样进行比较: a [i] 与 b [i]
并将 a [i] 与 c [i] 进行比较
我试过的:
我使用“;”分割字符串 然后我像上面提到的那样将两边分开,我使用了 charAT 但我不知道如何找出语句的其余部分,就像在这个例子中一样:x = x + a[i]; 它将返回 1 因为 x = x 但我不知道如何检查字符串的其余部分,以及我如何分隔字符串更像这个例子:a[i] = b[i] + c[i+1 ];
先感谢您
解决方案
听起来您想正确解析“计算器”字符串。假设这是您的字符串:
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 答案。
是的,树是有些复杂的构造,但是,正如我所说,那是因为这个概念从根本上来说有点复杂,优先级等等。
推荐阅读
- python - 用于通过算法之类的分类器填充缺失值的python函数?
- python - 如何在 PySide/PyQt 中,放大和缩小 UI
- javascript - Angular 7 配置或替代方案?
- mysql - GROUP BY column HAVING COUNT(*) > 1,仍然显示所有行?
- php - Solr:如果两者具有相同的值,则更改文档的顺序
- ios - 如何防止其他开发人员在 Xcode 中创建现有文件
- python - 如何在python中对两列进行透视和排序?
- c - 如何使用连续的 malloc 函数调用来增加 C 程序的内存 (RAM)
- azure - 如何将 Blob 快照还原到托管磁盘
- python-3.x - 当图像来自 Pillow 时尝试将 Qpixmap 设置为 Qlabel 时出现“分段错误(核心转储)”