строка ("; P") больше или строка ("-_-") больше? - PullRequest
1 голос
/ 02 марта 2012

Я нашел очень запутанным при сортировке текстового файла. Разные алгоритмы / приложения дают разные результаты, например, при сравнении двух строк str1=";P" и str2="-_-"

Просто для справки приведем ASCII для каждого символа в этой строке:

char(';') = 59;   char('P') = 80;
char('-') = 45;   char('_') = 95;

Итак, я пробовал разные методы, чтобы определить, какая строка больше, вот мой результат:

  1. В Microsoft Office Excel Сортировка Команда:

    "; P" <"-_-" </p>

  2. C ++ std :: string :: compare (string & str2), т.е. str1.compare(str2)

    "; P"> "-_-"

  3. C # string.CompareTo (), т.е. str1.CompareTo(str2)

    "; P" <"-_-" </p>

  4. C # string.CompareOrdinal (), т.е. CompareOrdinal(w1, w2)

    "; P"> "-_-"

Как показано, результат варьируется! На самом деле мой интуитивный результат должен быть равен методу 2 и 4, поскольку ASCII (';') = 59, что больше, чем ASCII ('-') = 45.

Так что я понятия не имею, почему Excel и C # string.CompareTo () дают противоположный ответ. Отмечено, что в C # вторая функция сравнения называется string.CompareOrdinal(). Означает ли это, что функция C # string.CompareTo() по умолчанию не является "Ordinal"?

Может ли кто-нибудь объяснить это несоответствие?

И кто-нибудь может объяснить в CultureInfo = {en-US}, почему он говорит: P> -_-? , что является основной мотивацией или принципом? И я когда-либо слышал о разном двойном умножении в разных культурах. Это скорее культурный шок ..!

Ответы [ 2 ]

5 голосов
/ 02 марта 2012
  1. std::string::compare: «результат сравнения символов зависит только от его кода символа». Это просто порядковый номер.
  2. String.CompareTo: «выполняет сравнение слов (с учетом регистра и с учетом культуры) с использованием текущей культуры». Так что это не порядковый номер, поскольку обычные пользователи не ожидают, что такие вещи будут отсортированы.
  3. String::CompareOrdinal: по имени "выполняет сравнение с учетом регистра с использованием порядковых правил сортировки".

РЕДАКТИРОВАТЬ: CompareOptions имеет подсказку: «Например, дефис (« - ») может иметь очень маленький вес, так что появляются« кооператив »и« кооператив »появляются рядом друг с другом в отсортированном списке. "

3 голосов
/ 02 марта 2012

Excel 2003 (и более ранние версии) выполняет сортировку, игнорируя дефисы и апострофы, поэтому ваш тип сортировки действительно сравнивает ; с _, что дает полученный результат.Вот ссылка службы поддержки Microsoft об этом.Довольно скудно, но достаточно, чтобы понять суть.

...