Сравнение строк "Логика" - PullRequest
       47

Сравнение строк "Логика"

6 голосов
/ 08 декабря 2009

Может кто-нибудь сказать мне почему приведенные ниже сравнения строк дают эти результаты?

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

Я пробовал сравнивать строки в C и Python, результат, очевидно, правильный, я просто не могу понять, как вычисляется результат ...

П.С .: Я знаю, что сравнивать строки разной длины - это то, что вы не должны делать, но я все еще задаюсь вопросом о логике вышеупомянутых строк ;-)

Ответы [ 11 ]

23 голосов
/ 08 декабря 2009

«1» равно «1».

«0» стоит перед «2» (поэтому «1040» <«12000»). </p>

«4» следует после «0» (то есть «1040»> «10000»).

7 голосов
/ 08 декабря 2009

Причудливое слово, описывающее этот порядок: « лексикографический порядок » (и иногда «словарный порядок»). На обычном языке мы просто называем это «алфавитным порядком». Это означает, что мы сначала размещаем порядок в нашем алфавите (A, B, ... Z и т. Д.), А затем, чтобы сравнить два слова в этом алфавите, мы сравниваем по одному символу за раз, пока найдите два неравных символа в одной и той же позиции и верните сравнение между этими двумя символами.

Пример: «естественный» порядок в алфавите { A, B, C, ..., Z } таков: A < B < C < ... < Z. Учитывая два слова s = s_1s_2...s_m и t = t_1t_2...t_n, мы сравниваем s_1 с t_1. Если s_1 < t_1, мы говорим, что s < t. Если s_1 > t_1, мы говорим, что s > t. Если s_1 = t_1, мы повторяем слова s_2...s_m и t_2...t_n. Чтобы это работало, мы говорим, что пустая строка меньше всех непустых строк.

В старые времена, до Unicode и т.п., упорядочивание наших символов было просто упорядочением кодов символов ASCII. Итак, у нас есть 0 < 1 < 2 < ... < 9 < ... < A < B < C < ... Z < ... < a < b < c < ... < z. Во времена Юникода все сложнее, но применяется тот же принцип.

Теперь, что все это означает, что если мы хотим сравнить 1040 и 12000, мы будем использовать следующее:

1040 сравнить с 12000 равно 040 сравнить с 2000, что дает 040 < 2000, потому что 0 < 2, так что, наконец, 1040 < 12000.

1040 сравнить с 10000 равно 040 сравнить с 0000 равно 40 сравнить с 000, что дает 40 > 000, поскольку 4 > 0 так что, наконец, 1040 > 10000 .

Ключевым моментом здесь является то, что это строки и они не имеют числового значения; они просто символы, и у нас есть определенный порядок на наших символах. То есть мы могли бы получить точно такой же ответ, если бы мы заменили 0 на A, 1 на B, ... и 9 на J и сказали, что A < B < C < ... < J. (В этом случае мы будем сравнивать BAEA с BAAAA и BAEA с BCAAA.)

6 голосов
/ 08 декабря 2009

Думайте в алфавитном порядке.

4 голосов
/ 08 декабря 2009

Вы испытываете лексикографический порядок .

В этой книге 1010 * Элементы программирования есть *1007* некоторые обобщенные алгоритмы для этого упорядочения. Поиск по слову lexicographical.

4 голосов
/ 08 декабря 2009

Строки сравниваются по одному символу слева направо:

10000
1040
12000

Нет ничего плохого в сравнении строк разной длины.

2 голосов
/ 08 декабря 2009

Сравнивает «числа» для каждого символа. В первом случае «1» == «1», но затем «0» <«2» в ASCII (и в виде целого числа), поэтому он возвращает true. </p>

Во втором случае 1 == 1, 0 == 0, но 4> 0, поэтому возвращается false.

И нет ничего плохого в сравнении строк другой длины ... но вы должны использовать соответствующий метод сравнения строк.

1 голос
/ 08 декабря 2009

Чтобы расширить ответ Джона П., думайте о строках как о словах и читайте их слева направо.

Чтобы взглянуть на это по-другому,

БАЭА придет до BCAAA, но после БАААА

1 голос
/ 08 декабря 2009

В C сравнения строк выполняются посимвольно. В первом случае первые символы строк равны, поэтому все сводится ко второму символу: «0» равно <«2», поэтому «1040» <«12000». Во втором случае первые два символа строк равны, поэтому третий символ является основой - «4»> «0», поэтому «1040»> «10000».

Если вы хотите, чтобы они сравнивались как числа, вам нужно сначала преобразовать их в числа, а затем выполнить сравнение.

0 голосов
/ 10 июля 2010

как насчет того, чтобы сделать их одинаковой длины?

Это объединит числа и альфы

1040 становится 01040

01040 <12000 теперь имеет смысл </p>

Может быть, поэтому он чувствовал, что неправильно сравнивать строки разной длины когда строки являются числами, они должны быть одинаковой длины

0 голосов
/ 08 декабря 2009

"10000" <= "1040" <= "12000" так же, как и "сфабриковать" <= "факт" <= "глупо". </p>

...