2013-06-28 3 views
8

В Java:Почему заглавная буква больше, чем маленькая буква в .Net?

"A".compareTo("a"); return -32 //"A" is less than "a". 

В .Net используется String.CompareTo:

"A".CompareTo("a"); return 1 //"A" is greater than "a". 

В .Net используется Char.CompareTo:

'A'.CompareTo('a'); return -32 //"A" is less than "a". 

Я знаю, что Java сравнивает строку символы, использующие его положение в таблице Unicode, но .Net - нет. Как определить, какая заглавная буква больше, чем маленькая буква в .Net?

String.CompareTo Method (String)

+0

я не задаю ваш вопрос во второй строке, которую вы сравниваете A с a, и это дает u 1, это означает, что A больше, чем то, что вы имеете в виду по вашему вопросу? – Sora

+0

Возможно, это из-за ** locale **. (Я не могу говорить на C#, хотя ...) – johnchen902

+0

Внутренне я использую вызов функции InternalCompareString Windows API, но не смог найти на нем документацию. – Tigran

ответ

3

The doc I could find говорит, что:

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

Таким образом, это не совсем то же самое, что Java's .compareTo(), который по умолчанию использует лексикографическое сравнение, используя, как вы говорите, точки кода Юникода.

Таким образом, в .NET это зависит от вашей текущей «культуры» (я думаю, Java назвал бы это «локалью»).

Похоже, что если вы хотите провести сравнение строк «à la Java» в .NET, вы должны вместо этого использовать String.CompareOrdinal().

Наоборот, если вы хотите выполнить сравнение строк на Java в зависимости от языка, вам необходимо использовать Collator.

Наконец, another link на MSDN показывает влияние культур на сравнения и даже равенство строк.

+0

Спасибо. Я знаю [String.CompareOrdinal()] (http://msdn.microsoft.com/en-us/library/vstudio/system.string.compareordinal%28v=vs.90%29.aspx). В этом вопросе я хочу знать, как определить, какая заглавная буква больше, чем маленькая буква в .Net? Потому что я пробую код: 'String.Compare (« A »,« a », false, CultureInfo.GetCultureInfo (« en-US »)), возвращаемое значение равно 1. Я не могу понять ... – smartleos

+0

Uhmwell, возможно, зависит от культуры. Например, попробуйте с французским языком. Я понятия не имею, как культуры влияют на сравнения - и я очень удивлен на самом деле тем, что .NET ведет себя таким образом по умолчанию, это кажется противоречивым. – fge

+0

Посмотрите на мое редактирование. Я полагаю, что .NET имеет то же самое, что и «Collator». – fge

-1

Это происходит из-за порядка символов в наборе символов ASCII. это то, что вы действительно должны понимать, если вы собираетесь делать какие-либо манипуляции с данными в своих программах.

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

Вы можете использовать функцию std :: sort с пользовательской функцией предиката, которая помещает все строчные буквы перед верхним регистром.

2

От Java String

Returns: значение 0, если строка аргумент равна данной строке; значение меньше 0, если эта строка лексикографически меньше аргумента строки; и значение больше 0, если эта строка лексикографически больше аргумента строки.

От .Net String.CompareTo

Этот метод выполняет слово (чувствительная к регистру и культуры чувствительных) сравнение с использованием текущей культуры.Для получения дополнительной информации о слове, строки и порядковые сортировки см. System.Globalization.CompareOptions.

Это сообщение объясняет difference between the comparison types

И в doc explains the difference между всеми типами сравнения;

Если вы посмотрите на этих двух, CurrentCulture и Порядковый

StringComparison.Ordinal: 
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131) 
LATIN SMALL LETTER I (U+0069) is greater than LATIN CAPITAL LETTER I (U+0049) 
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U 

StringComparison.CurrentCulture: 
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131) 
LATIN SMALL LETTER I (U+0069) is less than LATIN CAPITAL LETTER I (U+0049) 
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049) 

Порядковый является единственным, где "i" > "I" и, следовательно, Java, как

+0

Большое спасибо. – smartleos

-1

CompareTo возвращает целочисленное значение. Этот int указывает результат операции сравнения. Отрицательный 1 указывает, что первое значение меньше. Положительный 1 указывает, что первое значение больше. И ноль указывает, что два значения равны.

СотрагеТо результаты

5.CompareTo (6) = -1 Первая INT меньше.

6.CompareTo (5) = 1 Первый int больше.

5.CompareTo (5) = 0 Ints равны.

Если попробовать:

'A'.compareTo('a'); //returns you -32 

В изменениях кода строки и результат отличается как CompareTo на строке 9 и 10 говорит вам, 9 больше:

"9".CompareTo("10"); /returns 1 

В то время как в Java :

Он сравнивает код для символов.

image http://www.asciitable.com/index/asciifull.gif

A 65 и 'Z', 90, тогда как a = 97 и Z = 122, так что никакие символов капитала не больше, чем маленькие символы

ТАК Аа 97-65 = 32

+1

Пожалуйста, прекратите ссылаться на ASCII при разговоре на Java! Тот факт, что нижние коды кода Юникода и значения ASCII соответствуют чистому совпадению. – fge