Сравнение строк в c#how to compare strings in c#

Постоянство строк

Как ни странно, содержимое объекта типа string не подлежит изменению. Это означает, что однажды созданную последовательность символов изменить нельзя. Но
данное ограничение способствует более эффективной реализации символьных строк. Поэтому этот, на первый взгляд, очевидный недостаток на самом деле превращается в
преимущество. Так, если требуется строка в качестве разновидности уже имеющейся
строки, то для этой цели следует создать новую строку, содержащую все необходимые изменения. А поскольку неиспользуемые строковые объекты автоматически собираются в «мусор», то о дальнейшей судьбе ненужных строк можно даже не беспокоиться.

Следует, однако, подчеркнуть, что переменные ссылки на строки (т.е. объекты типа
string) подлежат изменению, а следовательно, они могут ссылаться на другой объект. Но содержимое самого объекта типа string не меняется после его создания.

Рассмотрим пример:

Скомпилируем приложение и загрузим результирующую сборку в утилиту ildasm.exe. На рисунке показан CIL-код, который будет сгенерирован
для метода void addNewString():

Обратите внимание на наличие многочисленных вызовов кода операции ldstr (загрузка строки).
Этот код операции ldstr в CIL предусматривает выполнение загрузки нового объекта string в управляемую кучу. В результате предыдущий объект, в котором содержалось
значение «This is my stroke», будет в конечном итоге удален сборщиком мусора

Решение задачи

Пусть заданы два числа: $a = \overline{a_1a_2 \ldots a_k},\ b = \overline{b_1b_2 \ldots b_k}$. Тогда $a > b \Leftrightarrow \exists i: \ \forall j < i \ a_j = b_j \ \wedge \ a_i = b_i$. Отсюда получаем необходимое условие получения максимального числа при перестановке в записи числа $a$ групп цифр $\overline{a_ia_{i+1} \ldots a_l}$ и $\overline{a_ja_{j+1} \ldots a_m} \ l<j$ местами: $i = \min_{1 < s < k} s: \ \exists t>s: \ a_t \gt a_s$. Если такое $i$ существует, то далее мы делаем перебор по всем возможным перестановкам, таким что первая группа чисел начинается с индекса $i$ и таким образом находим максимально возможное число. В противном случае данное число уже является максимальным.

Сравнение строк

Если оператор отношения применяется к двум строкам, то сравнение происходит побуквенно/посимвольно. То есть сравнение происходит так: каждый символ (буква) первой строки сравнивается с соответствующим символом второй строки и так, до того момента, пока символы не будут разными, и тогда какой символ больше – та строка и больше. Если же в одной из строк закончились символы, то считаем, что она меньше, а если закончились в обеих – строки равны.

Теперь разберем, как происходит сравнение каждого символа. Каждый символ переводится в числовое значение, согласно кодировке Unicode, и суть сравнения символов сводиться к сравнению двух чисел. Например, десятичные (Dec) значения символов кирилицы лежат в диапазоне от 1024 до 1280.

Пример:

Начинаем сравнивать первые символы: str1 (буква «А») и str2 (буква «а»).

В JavaScript, как и в других языках програмирования, есть метод для получения цифрового кода из символа:

Метод возвращает код символа расположенного на позиции в строке . Отсчет позиций символов в строке начинается с нуля.

Выполнить код »
Скрыть результаты

Если бы первые символы строк были равны, то дальше сравнивались бы следующие символы попарно.

В этом примере строка считается меньше, чем строка , потому что буква имеет код , а буква – . Причина в том, что коды прописных букв всегда меньше, чем строчных.

Чтобы правильно сравнить строки по алфавиту, необходимо перед сравнением преобразовать оба операнда в один регистр (например, в нижний):

Выполнить код »
Скрыть результаты

После преобразования в нижний регистр слово «апельсин» становится больше, чем слово «абрикос», потому что вторая буква имеет код , а вторая буква переменной – .

Примечание: Обычно, буква расположенная в алфавитном порядке раньше имеет меньший числовой код, чем буква (в том же регистре) расположенная в алфавитном порядке после неё.

Не менее интересная ситуация складывается при сравнении чисел, предствленных в строковой форме, например:

Выполнить код »
Скрыть результаты

В примере выше «15»

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

Выполнить код »
Скрыть результаты

В этом примере строка «15» преобразуется в число 15, а затем производится сравнение полученных чисел.

Когда строка сравнивается с числом, она преобразуется в число и выполняется числовое сравнение операндов.

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

Выполнить код »
Скрыть результаты

CompareToCompareTo

Метод String.CompareTo сравнивает строку, которую инкапсулирует текущий строковый объект, с другой строкой или объектом.The String.CompareTo method compares the string that the current string object encapsulates to another string or object. Возвращаемые этим методом значения идентичны значениям, возвращаемым методом String.Compare в предыдущей таблице.The return values of this method are identical to the values returned by the String.Compare method in the previous table.

Важно!

Метод String.CompareTo в основном предназначен для использования при упорядочивании или сортировке строк.The String.CompareTo method is primarily intended for use when ordering or sorting strings. Не следует использовать метод String.CompareTo для проверки на равенство (то есть для явного поиска возвращаемого значения 0 без учета того, является ли одна строка меньше или больше другой).You should not use the String.CompareTo method to test for equality (that is, to explicitly look for a return value of 0 with no regard for whether one string is less than or greater than the other). Для определения равенства двух строк используйте метод .Instead, to determine whether two strings are equal, use the method.

В примере ниже метод String.CompareTo используется для сравнения объекта с объектом .The following example uses the String.CompareTo method to compare the object to the object.

Этот пример выводит на консоль значение .This example displays to the console.

Все перегрузки метода String.CompareTo по умолчанию выполняют сравнение с учетом языка и региональных параметров и регистра.All overloads of the String.CompareTo method perform culture-sensitive and case-sensitive comparisons by default. У этого метода нет перегрузок, позволяющих выполнять сравнение без учета языка и региональных параметров.No overloads of this method are provided that allow you to perform a culture-insensitive comparison. В целях повышения ясности кода рекомендуется использовать вместо него метод String.Compare , указывая CultureInfo.CurrentCulture для операций с учетом языка и региональных параметров и CultureInfo.InvariantCulture для операций без учета языка и региональных параметров.For code clarity, we recommend that you use the String.Compare method instead, specifying CultureInfo.CurrentCulture for culture-sensitive operations or CultureInfo.InvariantCulture for culture-insensitive operations. Примеры, демонстрирующие использование метода String.Compare для сравнения с учетом и без учета языка и региональных параметров, см. в разделе Сравнение строк без учета языка и региональных параметров.For examples that demonstrate how to use the String.Compare method to perform both culture-sensitive and culture-insensitive comparisons, see Performing Culture-Insensitive String Comparisons.

Проверьте, равны ли две строки

В большинстве случаев при сравнении строк вы хотите проверить, равны ли строки или нет.

Следующий скрипт использует команду [, чтобы проверить, совпадают ли строки с оператором =:

#!/bin/bash

VAR1="AndreyEx"
VAR2="AndreyEx"

if ; then
    echo "Строки равны."
else
    echo "Строки не равны."
fi

Когда скрипт выполнится, он выведет следующий вывод.

Строки равны.

Вот еще один скрипт, который принимает входные данные от пользователя и сравнивает заданные строки. В этом примере мы будем использовать команду [[ и оператор ==.

#!/bin/bash

read -p "Введите первую строку: " VAR1
read -p "Введите вторую строку: " VAR2

if ]; then
    echo "Строки равны."
else
    echo "Строки не равны."
fi

Запустите скрипт и введите строки при появлении запроса:

Введите первую строку: AndreyEx
Введите вторую строку: Ubuntu
Строки не равны.

Вы также можете использовать логические и && и или || для сравнения строк:

] && echo "Равны" || echo "Не равны"
Не равны

Как работает функция?

Программа после поиска искомого значения переходит во второй столбец, чтобы извлечь возвращаемый элемент.

С одним условием

Рассмотрим функцию на простом примере поиска сотрудника по присвоенному ему коду. Таблицу нужно отсортировать в порядке возрастания.

  1. Кликнуть по ячейке справа от таблицы или под ней и вписать искомый номер.
  2. В ячейке рядом ввести функцию ВПР через знак «=», либо же использовать опцию «Вставить функцию» в разделе «Формулы». Проще использовать именно опцию – там есть подсказки, какие именно данные нужны.

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

  4. Нажать «Enter» – и появится результат поиска.

Когда таблица не отсортирована и данные введены в хаотичном порядке, результат будет неправильный – программа найдет ближайшее соответствие («ИСТИНА»). Но можно не сортировать таблицу, а указать интервальный просмотр «ЛОЖЬ».

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

С несколькими условиями

Часто на практике требуется сравнить данные нескольких диапазонов и выбрать значение с учетом 2-х и более критериев. Здесь задействована также функция ЕСЛИ, которая отвечает как раз за условия.

Из таблицы нужно найти показатель выручки по конкретному менеджеру в определенный день:

  1. В первую выделенную ячейку вписать дату, во вторую – фамилию менеджера. В третьей ячейке будет происходить поиск.

  2. Кликнуть по пустой ячейке и ввести формулу =ВПР(G1;ЕСЛИ(C2:C12=G2;A2:D12;»»);4;0).

  3. Для подтверждения действия зажать комбинацию клавиш Ctrl+Shift+Enter. Нажатие на «Enter» не сработает в этом случае, потому что формула должна быть выполнена в массиве (об этом свидетельствуют скобки «{}», в которые взята вся формула).

Поиск по нескольким столбцам

Объем данных расширен, и нужно найти конкретное значение среди нескольких столбцов, просуммировав данные с помощью функции СУММ.

  1. Кликнуть по ячейке и ввести формулу =СУММ(ВПР(G1;A1:D12;{2;3;4};ЛОЖЬ)). Для третьего аргумента перечисление столбцов происходит в скобках «{}».

  2. Одновременно зажать клавиши Ctrl+Shift+Enter. В результате формула будет взята в фигурные скобки «{}».

Программа сравнивает данные в таблице и, как только определяет точное совпадение, суммирует их.

Таким же способом можно найти среднее значение с помощью СРЗНАЧ: =СРЗНАЧ(ВПР(G1;A1:D12;{2;3;4};ЛОЖЬ)).

Сравнение двух таблиц

ВПР помогает сопоставить значения в таблицах.

Необходимо сравнить зарплату сотрудников за 2 месяца, для этого:

  1. В таблице с зарплатой за март добавить еще один столбец.

  2. Клацнуть по первой ячейке в столбце и написать функцию ВПР со следующими аргументами: =ВПР($A$2:$A$12;ссылка_на_новый_лист!$A$2:$B$12;2;ЛОЖЬ). То есть нужно выделить диапазон с фамилиями менеджеров и сделать ссылки (строки и столбца) неизменными с помощью знака «$», посмотреть его в таблице с новой зарплатой, взять данные из второго столбца новой зарплаты и подставить их в ячейку С2. В результате отобразится первый результат.

  3. При помощи маркера заполнения протянуть полученное значение вниз.

По желанию теперь можно найти численную и процентную разницу.

Поиск в выпадающем списке

Необходимо настроить функцию так, чтобы при выборе элемента из выпадающего списка отображалось его числовое значение.

Для создания раскрывающегося списка:

  1. Поставить курсор в ячейку, где он будет располагаться.
  2. Перейти в раздел книги «Данные» – «Проверка данных».

  3. В «Типе данных» выбрать «Список», задать диапазон (в нашем случае – фамилии менеджеров).

  4. Нажать «Ок». Отобразится список.

  5. В следующую ячейку вписать функцию ВПР. Первый аргумент – ссылка на раскрывающийся список, второй – диапазон таблицы, третий – номер столбца, четвертый – «ЛОЖЬ». В итоге получится следующее: =ВПР(E1;A1:B12;2;ЛОЖЬ). Нажать «Enter».

Меняется фамилия в списке – меняется и зарплата.

Перенос данных

Есть таблица с менеджерами и объемом их продаж. Во второй таблице значится сумма премии за продажу для каждого менеджера. Необходимо перенести данные в левую таблицу, чтобы подсчитать общую выручку (произведение объема продаж и премии за 1 продажу: =ПРОИЗВЕД(C2*D2)).

  1. Выделить первую ячейку с премией в левой таблице. Написать функцию с аргументами, сделать неизменными значения из второй таблицы, указать в третьем аргументе столбец 2, вместо «ЛОЖЬ» можно вписать 0: =ВПР(B2;$G$2:$H$12;2;0)

  2. Протянуть формулу вниз, чтобы заполнить все ячейки.

Функции

Имя Примечания
копирует n байт из области памяти src в dest, которые не должны пересекаться, в противном случае результат не определён (возможно как правильное копирование, так и нет)
копирует n байт из области памяти src в dest, которые в отличие от могут перекрываться
возвращает указатель на первое вхождение значения c среди первых n байтов s или NULL, если не найдено
сравнивает первые n символов в областях памяти
заполняет область памяти одним байтом z
дописывает строку src в конец dest
дописывает не более n начальных символов строки src (или всю src, если её длина меньше) в конец dest
возвращает адрес символа c в строке s, начиная с головы, или NULL, если строка s не содержит символ c
возвращает адрес символа c в строке s, начиная с хвоста, или NULL, если строка s не содержит символ c
лексикографическое сравнение строк (возвращает «0», если строки одинаковые, положительное, если первая строка больше, и отрицательное, если меньше)
лексикографическое сравнение первых n байтов строк
лексикографическое сравнение строк с учетом локали collating order
копирует строку из одного места в другое
копирует до n байт строки из одного места в другое
возвращает строковое представление сообщения об ошибке errno (не потоко-безопасная)
возвращает длину строки
определяет максимальную длину начальной подстроки, состоящей исключительно из байтов, перечисленных в accept
определяет максимальную длину начальной подстроки, состоящей исключительно из байтов, не перечисленных в reject
находит первое вхождение любого символа, перечисленного в accept
находит первое вхождение строки needle в haystack
преобразует строку в последовательность токенов. Не потоко-безопасная, не реентерабельная.
создает оттранслированную копию строки, такую, что дословное сравнение её (strcmp) будет эквивалентно сравнению с коллатором.

Расширения к ISO C

Имя Примечания Определена в
создает копию строки и возвращает указатель на неё POSIX; первоначально расширение в BSD
вариант с контролем границ ISO/IEC WDTR 24731
вариант с возвратом байта, следующего за последним записанным GNU
копирует до n байт из одной области памяти в другую (не должны пересекаться), останавливаясь при встрече символа c UNIX 98?
возвращает строкое представление кода ошибки errno (потоко-безопасная; небольшая разница в семантике между GNU и XSI/POSIX) GNU, POSIX
вариант с контролем границ первоначально OpenBSD, теперь также FreeBSD, Solaris, Mac OS X
потоко-безопасная реентерабельная версия strtok POSIX
по аналогии с , возвращает строковое представление сигнала (не потоко-безопасная) BSDs, Solaris, Linux

СравнениеCompare

Статический метод String.Compare позволяет тщательно сравнивать две строки.The static String.Compare method provides a thorough way of comparing two strings. Этот метод учитывает язык и региональные параметры.This method is culturally aware. Эту функцию можно использовать для сравнения двух строк или подстрок двух строк.You can use this function to compare two strings or substrings of two strings. Кроме того, имеются перегруженные методы, которые учитывают или не учитывают регистр и вариативность языка и региональных параметров.Additionally, overloads are provided that regard or disregard case and cultural variance. В таблице ниже приведены три целочисленных значения, которые может возвращать этот метод.The following table shows the three integer values that this method might return.

Возвращаемое значениеReturn value УсловиеCondition
Отрицательное целое числоA negative integer Первая строка предшествует второй в порядке сортировки.The first string precedes the second string in the sort order.-или—or-Первая строка имеет значение .The first string is .
Первая и вторая строка равны.The first string and the second string are equal.-или—or-Обе строки имеют значение .Both strings are .
Положительное целое числоA positive integer-или—or-11 Первая строка следует за второй в порядке сортировки.The first string follows the second string in the sort order.-или—or-Вторая строка имеет значение .The second string is .

Важно!

Метод String.Compare в основном предназначен для использования при упорядочивании или сортировке строк.The String.Compare method is primarily intended for use when ordering or sorting strings. Не следует использовать метод String.Compare для проверки на равенство (то есть для явного поиска возвращаемого значения 0 без учета того, является ли одна строка меньше или больше другой).You should not use the String.Compare method to test for equality (that is, to explicitly look for a return value of 0 with no regard for whether one string is less than or greater than the other). Для определения равенства двух строк используйте метод .Instead, to determine whether two strings are equal, use the method.

В примере ниже метод String.Compare используется для определения относительных значений двух строк.The following example uses the String.Compare method to determine the relative values of two strings.

Этот пример выводит на консоль значение .This example displays to the console.

В предыдущем примере по умолчанию учитывается язык и региональные параметры.The preceding example is culture-sensitive by default. Для сравнения строк без учета языка и региональных параметров используйте перегрузку метода String.Compare , которая позволяет указать язык и региональные параметры с помощью параметра culture .To perform a culture-insensitive string comparison, use an overload of the String.Compare method that allows you to specify the culture to use by supplying a culture parameter. Пример, демонстрирующий использование метода String.Compare для сравнения без учета языка и региональных параметров, см. в разделе Сравнение строк без учета языка и региональных параметров.For an example that demonstrates how to use the String.Compare method to perform a culture-insensitive comparison, see Performing Culture-Insensitive String Comparisons.

Проверка строки на пустое значение

Сравнение с помощью операторов -z и -n применяется для определения наличия содержимого в переменной. Таким образом, вы можете найти пустые строки bash. Пример:

Результат работы кода:

В этом примере создаются две строковые переменные — val1 и val2. Операция -n определяет, имеет ли переменная val1 ненулевую длину, а -z проверяет val2 и val3 на нулевую. Примечательно то, что последняя не была определена до момента сравнения, но интерпретатор считает, что её длина всё же равна нулю. Такой нюанс следует учитывать при различных проверках сценариев. И, если нет уверенности в том, какое значение содержится в переменной и задано ли оно вообще, стоит проверить её с помощью оператора -n или -z и лишь затем использовать по назначению.

Стоит обратить внимание и на функцию -n. Если ей для проверки будет передана необъявленная или пустая переменная, будет возвращена истина, а не ложь

Для таких случаев следует заключать проверяемую строку (переменную) в двойные кавычки, чтобы выглядело это так:

РавноEquals

С помощью метода String.Equals можно легко определить идентичность двух строк.The String.Equals method can easily determine if two strings are the same. Этот метод учитывает регистр и возвращает логическое значение true или false .This case-sensitive method returns a true or false Boolean value. Метод можно вызывать из существующего класса, как показано в следующем примере.It can be used from an existing class, as illustrated in the next example. В примере ниже метод Equals используется для определения того, содержит ли строковый объект фразу «Hello World».The following example uses the Equals method to determine whether a string object contains the phrase «Hello World».

Этот пример выводит на консоль значение .This example displays to the console.

Этот метод также можно использовать как статический.This method can also be used as a static method. В примере ниже два строковых объекта сравниваются с помощью статического метода.The following example compares two string objects using a static method.

Этот пример выводит на консоль значение .This example displays to the console.

Неизменность строковых объектовImmutability of String Objects

Строковые объекты являются неизменяемыми: их нельзя изменить после создания.String objects are immutable: they cannot be changed after they have been created. Может показаться, что все методы String и операторы C# изменяют строку, но в действительности они возвращают результаты в новый строковый объект.All of the String methods and C# operators that appear to modify a string actually return the results in a new string object. Когда содержимое и объединяется для формирования одной строки, две исходные строки не изменяются, как показано в следующем примере.In the following example, when the contents of and are concatenated to form a single string, the two original strings are unmodified. Оператор создает новую строку, которая содержит объединенное содержимое.The operator creates a new string that contains the combined contents. Этот новый объект присваивается переменной , а исходный объект, который был присвоен , освобождается для сборки мусора, так как ни одна переменная не ссылается на него.That new object is assigned to the variable , and the original object that was assigned to is released for garbage collection because no other variable holds a reference to it.

Так как «изменение» строки на самом деле является созданием новой строки, создавать ссылки на строки следует с осторожностью.Because a string «modification» is actually a new string creation, you must use caution when you create references to strings. Если вы создадите ссылку на строку, а затем «измените» исходную строку, ссылка будет по-прежнему указывать на исходный объект, а не на новый объект, который был создан при изменении строки.If you create a reference to a string, and then «modify» the original string, the reference will continue to point to the original object instead of the new object that was created when the string was modified

Это поведение проиллюстрировано в следующем коде:The following code illustrates this behavior:

Сведения о создании новых строк, основанных на таких изменениях, как операции поиска и замены исходной строки, см. в инструкциях по изменению содержимого строки.For more information about how to create new strings that are based on modifications such as search and replace operations on the original string, see How to modify string contents.

Равенство ссылок и интернирование строкReference equality and string interning

Ни один из примеров не использовал ReferenceEquals.None of the samples have used ReferenceEquals. Этот метод определяет, являются ли две строки одним и тем же объектом, что может привести к несогласованности результатов при сравнении строк.This method determines if two strings are the same object, which can lead to inconsistent results in string comparisons. Следующий пример демонстрирует функцию интернирования строк в C#.The following example demonstrates the string interning feature of C#. При объявлении программой двух или более идентичных переменных строк компилятор сохраняет их в одном расположении.When a program declares two or more identical string variables, the compiler stores them all in the same location. Вызвав метод ReferenceEquals, можно увидеть, что две строки фактически ссылаются на один и тот же объект в памяти.By calling the ReferenceEquals method, you can see that the two strings actually refer to the same object in memory. Чтобы избежать интернирования, используйте метод String.Copy.Use the String.Copy method to avoid interning. После копирования две строки имеют разное расположение хранения, хотя и имеют одинаковое значение.After the copy has been made, the two strings have different storage locations, even though they have the same value. Запустите следующий пример, показывающий, что строки и интернированы, находятся в одном хранилище.Run the following sample to show that strings and are interned meaning they share the same storage. Строки и таковыми не являются.The strings and are not.

Примечание

При проверке строк на равенство нужно использовать методы, которые явно указывают, какой вид сравнения следует выполнить.When you test for equality of strings, you should use the methods that explicitly specify what kind of comparison you intend to perform. Это делает код намного более понятным и удобочитаемым.Your code is much more maintainable and readable. Используйте перегрузки методов классов System.String и System.Array, которые принимают параметр перечисления StringComparison.Use the overloads of the methods of the System.String and System.Array classes that take a StringComparison enumeration parameter. Это позволяет указать тип выполняемого сравнения.You specify which type of comparison to perform. Старайтесь избегать использования операторов и при проверке на равенство.Avoid using the and operators when you test for equality. Методы экземпляра String.CompareTo всегда выполняют порядковое сравнение с учетом регистра.The String.CompareTo instance methods always perform an ordinal case-sensitive comparison. Они предназначены, прежде всего, для упорядочивания строк в алфавитном порядке.They are primarily suited for ordering strings alphabetically.

Вы можете интернировать строку или получить ссылку на существующую интернированную строку, вызвав метод String.Intern.You can intern a string or retrieve a reference to an existing interned string by calling the String.Intern method. Чтобы определить, является ли строка интернированной, вызовите метод String.IsInterned.To determine whether a string is interned, call the String.IsInterned method.

Конверсия число-строка и строка-число.

int atoi (const char * str);

Переводит строку в целое

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main() {
	char ex1[] = "   23  ";
	char ex2[] = "rule43";
	char ex3[] = "21st of May";
	printf("%d\n", atoi(ex1));
	printf("%d\n", atoi(ex2));
	printf("%d\n", atoi(ex3));
	getch();
}
double atof (const char* str);

Переводит строку в число типа double.

long int atol ( const char * str );

Переводит строку в число типа long

Все функции такого рода имеют название XtoY, где X и Y — сокращения типов. A обозначает ASCII. Соответственно, имеется обратная функция itoa (больше нет:)).
Таких функций в библиотеке stdlib.h очень много, все их рассматривать не хватит места.

Другие решения

Сравнение двух чисел — это величины быстрее, чем сравнение двух строк (представляющих одинаковые числа). Сравнение двух чисел просто требует сравнения отдельных битов и может быть сделано очень быстро с использованием любого из AND, XOR, дополнений 2 и т. Д.

Сравнение двух строк очень медленное и дорогое. Большинство алгоритмов требуют итерации всей строки и сопоставления каждого символа.

Например, скажем, мы хотим сравнить 9 с 12 (ложь). Для числового сравнения предположим, что алгоритм сравнивает отдельные биты.
9 = 1001
12 = 1100

Здесь алгоритм наихудшего случая будет сравнивать 4 бита.

Теперь, если мы представим «9» и «12» как строки, они будут сохранены в памяти как 16 бит каждая (Напомним: Java использует UTF-16 для представления строк в памяти) и должны быть переданы в алгоритм сравнения строк. Фактически, фактическая функция сравнения строк в Java приведена ниже:

Как вы можете видеть, для сравнения строк гораздо больше.

9

Как правило, большинство компьютеров имеют одну инструкцию для сравнения целых, длинных и т. Д.
и займет не более пары учебных циклов. Строки обычно сравниваются служебной функцией / методом (может быть странное исключение из этого правила).

в Java, например, строка в основном представлена ​​как

И метод равно

Метод equals делает оба this == anObject а также n == anotherString.count, оба по существу целочисленные сравнения, даже до того, как он начинает сравнивать символы. Это займет намного больше времени, чем одна инструкция, которая занимает целочисленное сравнение.

Сравнение строки C является проще / быстрее чем эквивалент Java, но он будет содержать своего рода цикл и несколько инструкций для каждого прохождения цикла.

Это займет больше времени, чем одна инструкция, которую требует Integer Compare

1

Да, но это не имеет ничего общего с хешированием.

Сравнение чисел включает в себя простые аппаратные инструкции, которые сравнивают биты.

Сравнение строк включает в себя (а) итерацию по обеим строкам до тех пор, пока вы не найдете отличающиеся символы (в отличие от чисел, которые имеют фиксированный размер) и (б) много магии Юникода (разные строки разной длины могут фактически быть равными, а разные символы в разном коде блоки сравнивают по разному).

Хеширование обычно используется для преобразования строки в индекс массива.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *