【问题标题】:String Compare "Logic"字符串比较“逻辑”
【发布时间】:2010-12-24 04:44:11
【问题描述】:

谁能告诉我为什么下面的字符串比较会产生这些结果?

>>"1040"<="12000"  
True  
>> "1040"<="10000"  
False

我在C和Python中都尝试过字符串比较,结果显然是正确的,我就是想不通结果是怎么计算出来的……

P.S.:我知道比较不同长度的字符串是你不应该做的事情,但我仍然想知道上述几行背后的逻辑;-)

【问题讨论】:

    标签: language-agnostic string comparison


    【解决方案1】:

    “1”等于“1”。

    “0”在“2”之前(所以“1040”

    “4”在“0”之后(所以“1040”>“10000”)。

    【讨论】:

      【解决方案2】:

      这里描述这种排序的花哨的词是“lexicographical order”(有时是“字典顺序”)。在日常语言中,我们只是将其称为“字母顺序”。这意味着我们首先对我们的字母表进行排序(A、B、...Z 等),然后比较这个字母表中的两个单词,我们一次比较一个字符,直到我们在同一位置找到两个不相等的字符并返回这两个字符之间的比较。

      示例:字母表{ A, B, C, ..., Z } 上的“自然”排序是A &lt; B &lt; C &lt; ... &lt; Z。给定两个词s = s_1s_2...s_m 和t = t_1t_2...t_n,我们将s_1 与t_1 进行比较。如果s_1 &lt; t_1 我们说s &lt; t。如果s_1 &gt; t_1 我们说s &gt; t。如果s_1 = t_1,我们会递归s_2...s_m 和t_2...t_n。为此,我们说空字符串小于所有非空字符串。

      在过去,在 Unicode 等之前,我们符号的排序只是 ASCII 字符代码的排序。那么我们有0 &lt; 1 &lt; 2 &lt; ... &lt; 9 &lt; ... &lt; A &lt; B &lt; C &lt; ... Z &lt; ... &lt; a &lt; b &lt; c &lt; ... &lt; z。在 Unicode 时代它更复杂,但同样的原则也适用。

      现在,这意味着如果我们想比较 1040 和 12000,我们将使用以下代码:

      1040 与12000 比较等于040 与2000 比较,得到040 &lt; 2000,因为0 &lt; 2 所以最后是1040 &lt; 12000。

      1040 比较 10000 等于 040 比较 0000 等于 40 比较 000 得到 40 &gt; 000 因为 4 &gt; 0 所以,最后,1040 &gt; 10000 .

      这里的关键是这些是字符串,没有数字含义;它们只是符号,我们对符号有一定的排序。也就是说,如果我们将0 替换为A,将1 替换为B,...,并将9 替换为J 并说A &lt; B &lt; C &lt; ... &lt; J,我们可以获得完全相同的答案。 (在这种情况下,我们会将BAEA 与BAAAA 和BAEA 与BCAAA 进行比较。)

      【讨论】:

      • 并且,由于您的空字符串规则,较短的字符串比较长的字符串“少”。
      • @seh:没有B 大于AB,即使B 比AB 短。但是,如果您说前缀始终小于前缀的任何重要扩展,那么您的说法是正确的。
      【解决方案3】:

      按字母顺序思考。

      【讨论】:

      • 具体来说,想想"ABCB" &lt;= "ABBBB"。
      • @Pavel Minaev:你确定吗?
      • 我的意思是“想想它的评估结果,以及为什么”。
      【解决方案4】:

      比较字符串,一次一个字符,从左到右:

      10000
      1040
      12000
      

      比较不同长度的字符串没有错。

      【讨论】:

        【解决方案5】:

        您正在体验lexicographical ordering。

        在本书Elements of Programming 中有此订购的some generalized algorithms。搜索单词lexicographical。

        【讨论】:

          【解决方案6】:

          它逐个字符地比较“数字”。在第一种情况下,“1”==“1”,然后是 ASCII 中的“0”

          第二种情况,1==1,0==0,但是4>0,所以返回false。

          比较不同长度的字符串并没有错……但是你应该使用适当的字符串比较方法。

          【讨论】:

            【解决方案7】:

            在 C 中,字符串比较是逐个字符进行的。在第一种情况下,字符串的第一个字符相等,因此归结为第二个字符:'0' '0',所以"1040" > "10000"。

            如果要将它们作为数字进行比较,则需要先将它们转换为数字,然后再进行比较。

            【讨论】:

              【解决方案8】:

              要扩展 John P 的答案,请将字符串视为单词,并从左到右阅读它们。

              换个角度看,

              BAEA 会在 BCAAA 之前,但在 BAAAA 之后

              【讨论】:

                【解决方案9】:

                它比较每个字符,因为您正在比较字符串。如果您想比较数字,请将它们设为数字类型。

                【讨论】:

                  【解决方案10】:

                  “10000”

                  【讨论】:

                    【解决方案11】:

                    如何让它们的长度相同?

                    这将统一数字和字母

                    1040 变成 01040

                    01040

                    也许这就是为什么他觉得比较不同长度的字符串是错误的 当字符串是数字时,它们应该是相同的长度

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-05-18
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-07-06
                      • 2012-07-16
                      相关资源
                      最近更新 更多