Программирование в «Эврике»
Раньше мы имели дело с числовыми данными (целыми и действительными), а также со списками чисел. Другим часто используемым типом данных являются строки. В строковых данных можно хранить фамилии и имена, адреса, названия товаров и т.д. Чтобы задать в программе строку необходимо заключить последовательность символов в двойные кавычки:
a="У лукоморья дуб зеленый" b="" # Это пустая строка
Считать строковую переменную с клавиатуры можно при помощи стандартной функции input , при этом пользователь также должен заключить вводимую строку в кавычки. Пример:
a=input()
Конкатенация строк
Главная операция со строками — их объединение, когда одна строка записывается после другой строки. Эта операция называется и для нее используется оператор + :
a="abc" b="xyz" c=a+b print c # Будет напечатано abcxyz
Также при помощи оператора * можно многократно повторять одну и ту же строку. «Умножать» строку можно только на натуральное число:
print "="*20 # Будет напечатано 20 знаков " section">Выбор подстрокиСо строками можно работать во многом как и со списками, рассматривая строку, как список отдельных символов. Функция
lenдля строки возвращает ее длину. Все символы строки пронумерованы начиная с 0, а также в обратном порядке (с конца) начиная с -1. Например, еслиs="abc", тоlen(s)возвращает значение 3,s[0]иs[-3]— это символ"a",s[1]иs[-2]— это"b",s[2]иs[-1]— это символ"c". Обращение к несуществующему элементу строки приведет к ошибкеIndexError: string index out of range.Символ строки: a b c Его индекс: 0 1 2 или такой: -3 -2 -1Помимо обращения к отдельным символам строки, из строки можно выбрать подстроку в виде s[x:y] , где s — идентификатор строки, x — номер первого символа подстроки, y — номер первого символа, который не будет включен в подстроку. Пример:
s="abcdefgh" print s[2:6] # Будет напечатано cdefВ этом примере из строки s выбирается подстрока s[2:6] , состоящая из символов с индексами от 2 до 5.
При выборе подстроки можно не указать номер начального символа, тогда считается, что он равен 0 (то есть подстрока начинается с начала строки) или последний символ (тогда он считается равным длине строки, то есть подстрока заканчивается концом исходной строки). Также можно использовать отрицательные числа для задания номеров символов. Таким образом, извлечь из строки s первые три символа можно так: s[:3] , а последние три символа: s[-3:] . Указание недопустимых для данной строки индексов при выборе подстроки допускается и не приводит к ошибке.
В отличии от списков, изменять отдельные элементы элементы (то есть символы в строке) нельзя. Вместо этого можно пользоваться конкатенацией строк. Например, если хочется в строке s заменить первый символ на букву "a" , то это можно сделать при помощи конкатенации строки "a" и всей строки s за исключением первого символа: s="a"+s[1:] .
Рассмотрим пример программы, которая считывает строку с клавиатуры и находит в ней первое слово (то есть все символы до первого пробела.
s=input() # 1 for i in range(len(s)): # 2 if s[i]==" ": # 3 print s[:i] # 4 break # 5В первой строке программы в переменную s считывается строка с клавиатуры. Затем организовывается цикл, в котором переменная s меняется от 0 до len(s)-1 , то есть переменная i принимает подряд все номера символов в строке. В третьей строке программы проверяется, является ли i -й символ строки пробелом (то есть совпадает ли он со строкой из одного пробела). Если проверяемое условие истинно, то был найден первый слева строки пробел, на экран печатается первые i символов строки, то есть все символы с начала строки до найденного пробела, после чего выполнение цикла завершается инструкцией break .
Сравнение строк
Строки можно сравнивать между собой на равенство или неравенство при помощи операторов сравнения == и != . Также можно сравнивать строки при помощи операторов < , , >= , при этом строки сравниваются в лексикографическом (то есть алфавитном) порядке. Например, верны будут следующие неравенства: "a"
Приведем пример программы, которая по данной строке выбрасывает из нее все заглавные буквы латинского алфавита:
s=input() # 1 t="" # 2 for i in range(len(s)): # 3 if s[i]>="A" and s[i]В первой строке программы мы считывает строку s , затем заводим пустую строку t , в которую будем по очереди копировать все символы строки s при условии, что они не являются заглавными буквами. Далее в строке 3 организовывается цикл, в котором переменная i принимает всевозможные значения индексов элементов строки s , то есть от 0 до len(s)-1 . Внутри цикла мы проверяем, является ли символ s[i] заглавной буквой, сравнив его со строками "A" и "Z" (строка 4 программы). В случае истинности проверяемого условия пропускаем этот символ (строка 5 программы), иначе выполняется строка 6 , в которой в конец строки t дописывается символ s[i] . Завершается программа выводом строки t на экран.
Сравнение строк в .NET
Платформа .NET обеспечивает несколько методов для сравнения значений строк. В таблице ниже перечислены и описаны методы сравнения значений.
| Имя метода | Использовать |
|---|---|
| String.Compare | Сравнивает значения двух строк. Возвращает целочисленное значение. |
| String.CompareOrdinal | Сравнивает две строки без учета локального языка и региональных параметров. Возвращает целочисленное значение. |
| String.CompareTo | Сравнивает текущий строковый объект с другой строкой. Возвращает целочисленное значение. |
| String.StartsWith | Определяет, начинается ли строка с переданной строки. Возвращает логическое значение. |
| String.EndsWith | Определяет, заканчивается ли строка переданной строкой. Возвращает логическое значение. |
| String.Contains | Определяет, встречается ли символ или строка в другой строке. Возвращает логическое значение. |
| String.Equals | Определяет, совпадают ли две строки. Возвращает логическое значение. |
| String.IndexOf | Возвращает индекс позиции символа или строки начиная с начала проверяемой строки. Возвращает целочисленное значение. |
| String.LastIndexOf | Возвращает индекс позиции символа или строки начиная с конца проверяемой строки. Возвращает целочисленное значение. |
Метод Compare
Статический метод String.Compare позволяет тщательно сравнивать две строки. Этот метод учитывает язык и региональные параметры. Эту функцию можно использовать для сравнения двух строк или подстрок двух строк. Кроме того, имеются перегруженные методы, которые учитывают или не учитывают регистр и вариативность языка и региональных параметров. В таблице ниже приведены три целочисленных значения, которые может возвращать этот метод.
| Возвращаемое значение | Условие |
|---|---|
| Отрицательное целое число | Первая строка предшествует второй в порядке сортировки. |
Метод String.Compare в основном предназначен для использования при упорядочивании или сортировке строк. Не следует использовать метод String.Compare для проверки на равенство (то есть для явного поиска возвращаемого значения 0 без учета того, является ли одна строка меньше или больше другой). Для определения равенства двух строк используйте метод String.Equals(String, String, StringComparison) .
В примере ниже метод String.Compare используется для определения относительных значений двух строк.
String^ string1 = "Hello World!"; Console::WriteLine(String::Compare(string1, "Hello World?"));
string string1 = "Hello World!"; Console.WriteLine(String.Compare(string1, "Hello World?"));
Dim string1 As String = "Hello World!" Console.WriteLine(String.Compare(string1, "Hello World?"))
Этот пример выводит на консоль значение -1 .
В предыдущем примере по умолчанию учитывается язык и региональные параметры. Для сравнения строк без учета языка и региональных параметров используйте перегрузку метода String.Compare , которая позволяет указать язык и региональные параметры с помощью параметра culture . См. пример, демонстрирующий использование метода String.Compare для сравнения строк без учета языка и региональных параметров.
Метод CompareOrdinal
Метод String.CompareOrdinal сравнивает два строковых объекта без учета локального языка и региональных параметров. Возвращаемые этим методом значения идентичны значениям, возвращаемым методом Compare в предыдущей таблице.
Метод String.CompareOrdinal в основном предназначен для использования при упорядочивании или сортировке строк. Не следует использовать метод String.CompareOrdinal для проверки на равенство (то есть для явного поиска возвращаемого значения 0 без учета того, является ли одна строка меньше или больше другой). Для определения равенства двух строк используйте метод String.Equals(String, String, StringComparison) .
В примере ниже метод CompareOrdinal используется для сравнения значений двух строк.
String^ string1 = "Hello World!"; Console::WriteLine(String::CompareOrdinal(string1, "hello world!"));
string string1 = "Hello World!"; Console.WriteLine(String.CompareOrdinal(string1, "hello world!"));
Dim string1 As String = "Hello World!" Console.WriteLine(String.CompareOrdinal(string1, "hello world!"))
Этот пример выводит на консоль значение -32 .
Метод CompareTo
Метод String.CompareTo сравнивает строку, которую инкапсулирует текущий строковый объект, с другой строкой или объектом. Возвращаемые этим методом значения идентичны значениям, возвращаемым методом String.Compare в предыдущей таблице.
Метод String.CompareTo в основном предназначен для использования при упорядочивании или сортировке строк. Не следует использовать метод String.CompareTo для проверки на равенство (то есть для явного поиска возвращаемого значения 0 без учета того, является ли одна строка меньше или больше другой). Для определения равенства двух строк используйте метод String.Equals(String, String, StringComparison) .
В примере ниже метод String.CompareTo используется для сравнения объекта string1 с объектом string2 .
String^ string1 = "Hello World"; String^ string2 = "Hello World!"; int MyInt = string1->CompareTo(string2); Console::WriteLine( MyInt );
string string1 = "Hello World"; string string2 = "Hello World!"; int MyInt = string1.CompareTo(string2); Console.WriteLine( MyInt );
Dim string1 As String = "Hello World" Dim string2 As String = "Hello World!" Dim MyInt As Integer = string1.CompareTo(string2) Console.WriteLine(MyInt)
Этот пример выводит на консоль значение -1 .
Все перегрузки метода String.CompareTo по умолчанию выполняют сравнение с учетом языка и региональных параметров и регистра. У этого метода нет перегрузок, позволяющих выполнять сравнение без учета языка и региональных параметров. В целях повышения ясности кода рекомендуется использовать вместо него метод String.Compare , указывая CultureInfo.CurrentCulture для операций с учетом языка и региональных параметров и CultureInfo.InvariantCulture для операций без учета языка и региональных параметров. Примеры, демонстрирующие использование метода String.Compare для сравнения с учетом и без учета языка и региональных параметров, см. в разделе Сравнение строк без учета языка и региональных параметров.
Метод Equals
С помощью метода String.Equals можно легко определить идентичность двух строк. Этот метод учитывает регистр и возвращает логическое значение true или false . Метод можно вызывать из существующего класса, как показано в следующем примере. В примере ниже метод Equals используется для определения того, содержит ли строковый объект фразу "Hello World".
String^ string1 = "Hello World"; Console::WriteLine(string1->Equals("Hello World"));
string string1 = "Hello World"; Console.WriteLine(string1.Equals("Hello World"));
Dim string1 As String = "Hello World" Console.WriteLine(string1.Equals("Hello World"))
Этот пример выводит на консоль значение True .
Этот метод также можно использовать как статический. В примере ниже два строковых объекта сравниваются с помощью статического метода.
String^ string1 = "Hello World"; String^ string2 = "Hello World"; Console::WriteLine(String::Equals(string1, string2));
string string1 = "Hello World"; string string2 = "Hello World"; Console.WriteLine(String.Equals(string1, string2));
Dim string1 As String = "Hello World" Dim string2 As String = "Hello World" Console.WriteLine(String.Equals(string1, string2))
Этот пример выводит на консоль значение True .
Методы StartsWith и EndsWith
Метод String.StartsWith можно использовать для определения того, начинается ли строковый объект с тех же символов, которые включает другая строка. Этот метод учитывает регистр и возвращает значение true , если текущий строковый объект начинается с переданной строки, и значение false в противном случае. В примере ниже этот метод используется для определения того, начинается ли строковый объект со слова "Hello".
String^ string1 = "Hello World"; Console::WriteLine(string1->StartsWith("Hello"));
string string1 = "Hello World"; Console.WriteLine(string1.StartsWith("Hello"));
Dim string1 As String = "Hello World!" Console.WriteLine(string1.StartsWith("Hello"))
Этот пример выводит на консоль значение True .
Метод String.EndsWith сравнивает переданную строку с символами, находящимися в конце текущего строкового объекта. Он также возвращает логическое значение. В примере ниже конец строки проверяется с помощью метода EndsWith .
String^ string1 = "Hello World"; Console::WriteLine(string1->EndsWith("Hello"));
string string1 = "Hello World"; Console.WriteLine(string1.EndsWith("Hello"));
Dim string1 As String = "Hello World!" Console.WriteLine(string1.EndsWith("Hello"))
Этот пример выводит на консоль значение False .
Методы IndexOf и LastIndexOf
С помощью метода String.IndexOf можно определить позицию первого вхождения конкретного символа в строку. Этот метод учитывает регистр и начинает отсчет с начала строки. Он возвращает позицию переданного символа, используя отсчитываемый от нуля индекс. Если символ не удается найти, возвращается значение –1.
В примере ниже метод IndexOf используется для поиска первого вхождения символа " l " в строку.
String^ string1 = "Hello World"; Console::WriteLine(string1->IndexOf('l'));
string string1 = "Hello World"; Console.WriteLine(string1.IndexOf('l'));
Dim string1 As String = "Hello World!" Console.WriteLine(string1.IndexOf("l"))
Этот пример выводит на консоль значение 2 .
Метод String.LastIndexOf аналогичен методу String.IndexOf за исключением того, что он возвращает позицию последнего вхождения конкретного символа в строку. Он учитывает регистр и использует отсчитываемый от нуля индекс.
В примере ниже метод LastIndexOf используется для поиска последнего вхождения символа " l " в строку.
String^ string1 = "Hello World"; Console::WriteLine(string1->LastIndexOf('l'));
string string1 = "Hello World"; Console.WriteLine(string1.LastIndexOf('l'));
Dim string1 As String = "Hello World!" Console.WriteLine(string1.LastIndexOf("l"))
Этот пример выводит на консоль значение 9 .
Оба метода полезно использовать в сочетании с методом String.Remove . Для получения позиции символа используется метод IndexOf или LastIndexOf , после чего эта позиция передается методу Remove для удаления символа или начинающегося с него слова.
См. также
- Рекомендации по использованию строк в .NET
- Базовые операции со строками
- Выполнение строковых операций, не зависящих от языка и региональных параметров
- Таблицы сортировки весов, используемые платформа .NET Framework и .NET Core 1.0–3.1 в Windows
- Таблица элементов сортировки Юникода по умолчанию — используется .NET 5 на всех платформах и .NET Core в Linux и macOS
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Как сравнивать строки в Java?
В своей программе я использовал оператор == для сравнения строк. Но я наткнулся на баг, и при замене == на equals он пропал. Следует избегать оператора == ? Когда его можно использовать, а когда нет? В чём разница?
Отслеживать
задан 17 апр 2015 в 15:05
32.1k 19 19 золотых знаков 79 79 серебряных знаков 106 106 бронзовых знаков
Добавил ещё один "канонический" ответ. На английском SO это самый популярный вопрос как цель для закрытия дубликатов. Преимущественно перевод и компиляция How do I compare strings in Java?, плюс ещё по мелочи.
17 апр 2015 в 15:07
Школа на Хэшкоде 🙂
17 апр 2015 в 15:08
@AndrewBystrov Да. См. ru.stackoverflow.com/help/self-answer
17 апр 2015 в 15:30
@AndrewBystrov на SO это нормально, хотя я думал что "самоответ" синхронно с вопросом это не комильфо, но в правилах противопоказаний нет
17 апр 2015 в 18:49
@Discord хз. Может я и не прав, но лучше сделать один "эталонный" ответ и вопрос и закрывать на него все остальные точно такие же вопросы. Если возникает желание добавить по теме, то улучшать "эталонный" ответ.
23 фев 2016 в 13:27
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Оператор == сравнивает ссылки.
Метод equals сравнивает значения.
Следовательно, если вы хотите сравнить строки на равенство, следует использовать equals .
Однако в некоторых случаях строки гарантированно представлены одним и тем же объектом благодаря пулу строк (string interning). Эти случаи явно описаны в спецификации языка Java.
Оператор == используется для проверки, что две строки указывают на один и тот же объект.
// Эти строки имеют одно и тоже же значение new String("test").equals("test") // --> true // . но это разные объекты new String("test") == "test" // --> false // . эти строки тоже разные объекты new String("test") == new String("test") // --> false // . но эти строки указывают на один и тот же объект, // потому что компилятор добавляет все литералы в пул. "test" == "test" // --> true // Конкатенация литералов тоже происходит на стадии компиляции, // поэтому они указывают на один объект "test" == "te" + "st" // --> true // но вызов substring() происходит во время выполнения, // в результате получаются разные объекты. "test" == "!test".substring(1) // --> false // Строки из пула могут быть получены с помощью вызова intern(). "test" == "!test".substring(1).intern() // --> true
Надо отметить, что == заметно быстрее, чем equals (сравнение ссылки вместо вызова метода и посимвольного сравнения, если строки разной длины), поэтому, если вы работаете со строками из пула (или системного, или своего), замена equals на == может привести к заметному ускорению. Но это случается очень редко.
Остерегайтесь вызова equals на null ! Оператор == прекрасно сравнивает строки, если одна или более из них равна null , но вызов метода equals на строке, равной null , приведёт к исключению.
Для сравнения строк, которые могут быть равны null , вы можете воспользоваться следующим методом:
public static boolean equals(String str1, String str2)
Он присутствует в некоторых сторонних библиотеках, например, в Apache Commons.
Если вы пользуетесь современными средами разработки, то они предупредят, если вы попытаетесь сравнить строки с помощью оператора == . Всегда обращайте внимание на подобные предупреждения.
Операторы вычислений и приоритет
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel для iPad Excel для iPhone Excel для планшетов с Android Excel 2010 Excel для Mac 2011 Excel для телефонов с Android Еще. Меньше
Операторы определяют операции, которые необходимо выполнить над элементами формулы. Существует стандартный порядок вычислений, но его можно изменить с помощью скобок.
В этой статье
- Типы операторов
- Порядок выполнения действий в формулах Excel
Типы операторов
Существует четыре различных типа операторов вычислений: арифметические, сравнительные, текстовые (объединение текста) и ссылки.
Арифметические операторы
Выполнение основных математических операций, таких как с добавление, вычитание или умножение; объединить числа; и получить числовые результаты, используйте в формуле арифметические операторы:
Арифметический оператор
Возведение в степень
Операторы сравнения
Операторы сравнения используются для сравнения двух значений. При сравнении двух значений с помощью этих операторов результатом является логическое значение ИСТИНА или ЛОЖЬ.
Оператор сравнения
>= (знак «больше или равно»)
Больше или равно
Меньше или равно
Текстовый оператор конкатенации
С помощью амперсанд (&) можно совмещать (объединять) одну или несколько текстовых строк, чтобы получить один фрагмент текста.
Текстовый оператор
Соединение или объединение последовательностей знаков в одну последовательность
В этом примере между двумя словами вставляется пробел. Знак пробела определяется пробелом в открывающих и закрывающих кавычках (" ").
Операторы ссылок
Для определения ссылок на диапазоны ячеек можно использовать операторы, указанные ниже.
Оператор ссылки
Оператор диапазона, который образует одну ссылку на все ячейки, находящиеся между первой и последней ячейками диапазона, включая эти ячейки.
; (точка с запятой)
Оператор объединения. Объединяет несколько ссылок в одну ссылку.
Оператор пересечения, который возвращает ссылку на ячейки, общие с диапазонами в формуле. В этом примере ячейка C7 находится в обоих диапазонах, поэтому это пересечение.
Порядок выполнения действий в формулах Excel
В некоторых случаях порядок выполнения вычислений может повлиять на возвращаемую формулу, поэтому важно понимать, как определяется порядок и как можно изменить порядок получения нужных результатов.
Порядок вычислений
Формулы вычисляют значения в определенном порядке. Формула в Excel всегда начинается со знака равно (=). Знак равно означает Excel что последующие символы образуют формулу. После знака равно вычисляются элементы (операнды, например числа или ссылки на ячейки), разделенные операторами вычислений (такими как +, -, *или /). Excel вычисляет формулу слева направо в соответствии с определенным порядком для каждого оператора в формуле.
Приоритет операторов
Если в одной формуле используется несколько операторов, Microsoft Excel выполняет операции в порядке, указанном в приведенной ниже таблице. Если формула содержит операторы с одинаковым приоритетом — например, операторы деления и умножения, — они выполняются слева направо.