字符串比较“逻辑”

时间:2009-12-07 21:29:31

标签: language-agnostic string comparison

有人可以告诉我为什么下面的字符串比较会提供这些结果吗?

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

我在C和Python中尝试过字符串比较,结果显然是正确的,我只是无法弄清楚结果是如何计算出来的......

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

11 个答案:

答案 0 :(得分:23)

“1”等于“1”。

“0”出现在“2”之前(所以“1040”&lt;“12000”)。

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

答案 1 :(得分:7)

这里描述这种排序的奇特词是“lexicographical order”(有时候是“字典顺序”)。在日常用语中,我们只是将其称为“字母顺序”。这意味着我们首先在字母表中放置一个排序(AB,... Z等等)然后比较这个字母表中的两个单词我们比较一个我们在同一个位置找到两个不相等的字符,然后返回这两个字符之间的比较。

示例:字母{ A, B, C, ..., Z }上的“自然”排序是A < B < C < ... < Z。给定两个单词s = s_1s_2...s_mt = t_1t_2...t_n,我们将s_1t_1进行比较。如果s_1 < t_1我们说s < t。如果s_1 > t_1我们说s > t。如果s_1 = t_1我们会对单词s_2...s_mt_2...t_n进行递归。为此,我们说空字符串少于所有非空字符串。

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

现在,这意味着如果我们要比较104012000,我们会使用以下内容:

104012000相比等于0402000相比,后者040 < 2000因为0 < 2所以最后1040 < 12000 1}}。

104010000相比等于0400000相比等于40000相比,40 > 000因为4 > 0所以最后是1040 > 10000

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

答案 2 :(得分:6)

思考按字母顺序排列。

答案 3 :(得分:4)

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

10000
1040
12000

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

答案 4 :(得分:4)

您遇到了lexicographical ordering

本书some generalized algorithms中有Elements of Programming次排序。搜索单词lexicographical

答案 5 :(得分:2)

它逐个字符地比较“数字”。在第一种情况下,“1”==“1”,然后“0”<1。 ASCII中的“2”(以及整数),因此返回true。

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

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

答案 6 :(得分:1)

在C中,字符串比较是逐字符完成的。在第一种情况下,stings的第一个字符是相等的,所以它归结为第二个字符:'0'是&lt; '2',所以“1040”&lt; “12000”。在第二种情况下,字符串的前两个字符是相等的,因此第三个字符是基础 - '4'&gt; '0',所以“1040”&gt; “10000”。

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

答案 7 :(得分:1)

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

以另一种方式看待它,

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

答案 8 :(得分:0)

它会比较每个字符,因为您要比较字符串。如果您想比较这些数字,请将它们设为数字类型。

答案 9 :(得分:0)

“10000”&lt; =“1040”&lt; =“12000”与“制造”&lt; =“fact”&lt; =“愚蠢”的方式相同。

答案 10 :(得分:0)

如何让它们长度相同?

这将统一数字和alphas

1040变为01040

01040&lt; 12000现在有意义

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