【问题标题】:Is there a methods to compare between strings that have different length in java?有没有一种方法可以比较java中不同长度的字符串?
【发布时间】:2021-01-21 19:42:55
【问题描述】:

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

我有两种情况

第一种情况:

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

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

这里的问题是:

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

  • 一个 [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];

提前谢谢你

【问题讨论】:

  • 您似乎在这里问了几个问题。标题询问比较,但文本似乎更侧重于拆分解析。请将您的问题缩小到一个问题,并尽可能多地删除对描述您的问题并非绝对必要的内容。
  • 感谢您编辑我的问题,并对我试图解释和描述我的问题的问题感到困惑,以便阅读的人能够准确理解我的需求。是的,我主要关心的是比较,但我不能这样做,因为我不知道如何拆分零件以进行适当的比较。
  • 当你说:Index 3 -> a [i],我认为那是一个错字,你是想写Index 3 -> x + a[i]?如果是这样,请编辑,如果不是,嗯,也许对算法进行更多解释:)
  • @Hisham 如果是这种情况,请提出单独的问题 - 每个概念/问题一个问题。您可以关闭此问题并提出两个新问题,也可以修改此问题以将其缩小到一个想法并提出另一个单独的问题。
  • @rzwitserloot 是的,你说得对,这是一个错字,应该和你写的一样

标签: java arrays string split comparison


【解决方案1】:

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

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

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

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

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

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

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

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

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

答案是:嗯,它比你想象的要复杂。但这是一个已解决的问题 - 有大量的 java 解析器生成器可用。在网络上搜索'turn calculator string into tree parser java',例如,您可以访问this SO answer

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

【讨论】:

  • 所以我必须使用AST,正则表达式可以解决这类问题吗?
  • 我使用 antlr 收到了字符串,因为这个字符串将在 for 循环中,所以我能够在输入文件中找到 for 循环并将字符串作为文本获取,然后我在另一个类中进行分析。正如您在回答中提到的那样,遵循 AST 既困难又复杂,这就是为什么我尝试在不使用 AST 的情况下分析字符串
  • 另外,字符串将从用户那里接收,所以我不知道它们是怎么回事,它可能与上面的不同,但它与我在前面提到的概念相同前面的例子。请原谅我的英语,但我正在尽力正确解释我面临的问题。
  • 正则表达式不能这样做;像这样的计算表达式是不规则的。如果您已经在使用 ANTLR,请升级您的解析器定义,以便能够一次将其解析到单个节点而不是整个字符串。如果输入可以比您解释的更加多样化,那么您肯定需要一个完整的解析器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 2022-11-18
  • 2019-12-27
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
相关资源
最近更新 更多