Compareto c как работает
Перейти к содержимому

Compareto c как работает

  • автор:

Compareto c как работает

public int CompareTo (string str)

str — текст, сравниваемый с классом

Метод возвращает число:
текст в классе раньше по алфавиту чем текст str
=0 текст в классе одинаков с текстом str
>0 текст в классе позже по алфавиту чем текст str

string str1 = «Hallo» ;
string str2 = «Hsllo» ;

int result = str1.CompareTo(str2);
// result = -1

string str1 = «Hello» ;
string str2 = «HELLO» ;

int result = str1.CompareTo(str2);
// result = -1

string str1 = «Hello» ;
string str2 = «Hello» ;

int result = str1.CompareTo(str2);
// result = 0
// одинаковый текст

class String
Все методы и свойства класса String для работы с текстом.
← Предыдущая тема
Length (длина строки в C#). Пример: string str1 = «Hello»; int v1 = str1.Length;

Следующая тема →
ToLower (конвертирует текст в нижний регистр в C#). Пример: string str1 = «HELLO World!»; string str2 = str1.ToLower();

19) Метод String CompareTo ()

compareTo () используется для лексикографического сравнения двух строк. Каждый символ обеих строк преобразуется в значение Unicode. Однако, если обе строки равны, тогда этот метод возвращает 0, иначе это приведет только к отрицательному или положительному значению.

CompareTo определяется в интерфейсе java.lang.Comparable

Синтаксис :

public int compareTo(String str)

Ввод параметров:

str – этот метод принимает только один тип входных данных String.

Возвращает метод:

Этот метод Java возвращает тип данных int, который основан на лексикографическом сравнении двух строк.

  • возвращает
  • возвращает == 0, тогда две строки лексикографически эквивалентны
  • возвращает> 0, затем параметр, переданный методу сравнения, сначала лексикографически.

Давайте разберемся с примером:

Пример 1:

public class Sample_String < public static void main(String[] args) < String str_Sample = "a"; System.out.println("Compare To 'a' b is : " + str_Sample.compareTo("b")); str_Sample = "b"; System.out.println("Compare To 'b' a is : " + str_Sample.compareTo("a")); str_Sample = "b"; System.out.println("Compare To 'b' b is : " + str_Sample.compareTo("b")); >>

Вывод

Сравнить с ‘a’ b is: -1

Сравнить с ‘b’ a is: 1
Сравнить с ‘b’ b is: 0

  • Символ a стоит перед буквой b в алфавитном порядке. Следовательно, выход -1
  • Символ б идет после алфавитного. Следовательно, вывод равен 1
  • Символ b эквивалентен, следовательно, вывод равен 0.

Вы можете использовать метод Use «compareToIgnoreCase», если вы не хотите, чтобы результат был чувствительным к регистру.

Пример 2:

public class Sample_String < public static void main(String[] args) < //Compare to a String String str_Sample = "RockStar"; System.out.println("Compare To 'ROCKSTAR': " + str_Sample.compareTo("rockstar")); //Compare to - Ignore case System.out.println("Compare To 'ROCKSTAR' - Case Ignored: " + str_Sample.compareToIgnoreCase("ROCKSTAR")); >>

Вывод

Сравнить с ‘ROCKSTAR’: -32
Сравнить с ‘ROCKSTAR’ – регистр игнорируется: 0

Когда использовать метод CompareTo ()?

Метод CompareTo () используется для естественной сортировки строк. Естественная сортировка означает порядок сортировки, который применяется к объекту, например, лексический порядок для строки, числовой порядок для целых чисел сортировки и т. Д.

Лексический порядок – это не что иное, как алфавитный порядок. Метод compareTo выполняет последовательное сравнение букв в строке, имеющих одинаковую позицию.

В этом методе, если первая строка всегда лексикографически выше второй строки, она возвращает положительное число.

если a1> a2, он возвращает отрицательное число

если a1 == a2, возвращается 0

Пример 3:

public class Compare < public static void main(String[] args) < String s1 = "Guru1"; String s2 = "Guru2"; System.out.println("String 1: " + s1); System.out.println("String 2: " + s2); // Compare the two strings. int S = s1.compareTo(s2); // Show the results of the comparison. if (S < 0) < System.out.println("\"" + s1 + "\"" + " is lexicographically higher than " + "\"" + s2 + "\""); >else if (S == 0) < System.out.println("\"" + s1 + "\"" + " is lexicographically equal to " + "\"" + s2 + "\""); >else if (S > 0) < System.out.println("\"" + s1 + "\"" + " is lexicographically less than " + "\"" + s2 + "\""); >> >

Вывод:

Строка 1: Guru1

Строка 2: Guru2
“Guru1” лексикографически выше, чем “Guru2”

Объясните как работает compare() в порядке возрастания и убывания

Почему если в методе compare() возвращать return aStr.compareTo(bStr); то коллекция будет сортироваться в порядке возрастания, а если return bStr.compareTo(aStr); , то в порядке убывания?

Отслеживать
задан 20 авг 2021 в 20:09
teoretik_eugene teoretik_eugene
59 4 4 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Потому что упрощено говоря aStr.compareTo(bStr) равно -bStr.compareTo(aStr). Т.е. если aStr.compareTo(bStr) возвращает 1, то bStr.compareTo(aStr) вернёт -1. Поэтому и сортировка производится в обратную сторону.

Пример на числах: допустим в функцию сравнения (не эту, но похожую) передается два числа a и b. Если функция возвращает 1, то мы первое число ставим перед вторым. Если же -1, то второе перед первым. В одном случае получится возрастающая сортировка, в другом убывающая.

Отслеживать
ответ дан 20 авг 2021 в 20:15
25.9k 7 7 золотых знаков 31 31 серебряный знак 48 48 бронзовых знаков

Т.е., если у нас значение будет >0, то сортировка будет производиться в порядке возрастания, если же < 0 - то наоборот?

20 авг 2021 в 20:28
Вообще не совсем так, но для простоты пусть будет так.
20 авг 2021 в 20:31

Метод compareTo() уже и сравнивает, какая из строк «больше». А как этот результат дальше применяется из этого кода не видно.

Реализация интерфейса IComparable

Если требуется отсортировать коллекцию, состоящую из объектов определяемого пользователем класса, при условии, что они не сохраняются в коллекции класса SortedList, где элементы располагаются в отсортированном порядке, то в такой коллекции должен быть известен способ сортировки содержащихся в ней объектов. С этой целью можно, в частности, реализовать интерфейс IComparable для объектов сохраняемого типа. Интерфейс IComparable доступен в двух формах: обобщенной и необобщенной. Несмотря на сходство применения обеих форм данного интерфейса, между ними имеются некоторые, хотя и небольшие, отличия.

Если требуется отсортировать объекты, хранящиеся в необобщенной коллекции, то для этой цели придется реализовать необобщенный вариант интерфейса IComparable. В этом варианте данного интерфейса определяется только один метод, CompareTo(), который определяет порядок выполнения самого сравнения. Ниже приведена общая форма объявления метода CompareTo():

int CompareTo(object obj)

В методе CompareTo() вызывающий объект сравнивается с объектом obj. Для сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение вызывающего объекта больше, чем у объекта obj; и отрицательное — если значение вызывающего объекта меньше, чем у объекта obj. А для сортировки по убывающей можно обратить результат сравнения объектов. Если же тип объекта obj не подходит для сравнения с вызывающим объектом, то в методе CompareTo() может быть сгенерировано исключение ArgumentException.

Если требуется отсортировать объекты, хранящиеся в обобщенной коллекции, то для этой цели придется реализовать обобщенный вариант интерфейса IComparable. В этом варианте интерфейса IComparable определяется приведенная ниже обобщенная форма метода CompareTo():

int CompareTo(Т other)

В методе CompareTo() вызывающий объект сравнивается с другим объектом other. Для сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение вызывающего объекта больше, чем у объекта другого other; и отрицательное — если значение вызывающего объекта меньше, чем у другого объекта other. А для сортировки по убывающей можно обратить результат сравнения объектов. При реализации обобщенного интерфейса IComparable имя типа реализующего класса обычно передается в качестве аргумента типа.

Давайте рассмотрим пример реализации интерфеса IComparable для сортировки базы данных автомагазина:

using System; using System.Collections.Generic; namespace ConsoleApplication1 < class AutoShop : IComparable < public string CarName < set; get; >public int MaxSpeed < get; set; >public double Cost < get; set; >public byte Discount < get; set; >public int ID < get; set; >public AutoShop() < >public AutoShop(string CarName, int MaxSpeed, double Cost, byte Discount, int ID) < this.CarName = CarName; this.MaxSpeed = MaxSpeed; this.Cost = Cost; this.Discount = Discount; this.ID = ID; >// Реализуем интерфейс IComparable public int CompareTo(AutoShop obj) < if (this.Cost >obj.Cost) return 1; if (this.Cost < obj.Cost) return -1; else return 0; >public override string ToString() < return String.Format("\tМарка: \tМакс. скорость: \tЦена: \tСкидка: %", this.CarName,this.MaxSpeed,this.Cost,this.Discount,this.ID); > > class Program < static void Main() < Listdic = new List(); // Создадим множество автомобилей dic.Add(new AutoShop("Toyota Corolla", 180, 300000, 5, 1)); dic.Add(new AutoShop("VAZ 2114i", 160, 220000, 0, 2)); dic.Add(new AutoShop("Daewoo Nexia", 140, 260000, 5, 3)); dic.Add(new AutoShop("Honda Torneo", 220, 400000, 7, 4)); dic.Add(new AutoShop("Audi R8 Best", 360, 4200000, 3, 5)); Console.WriteLine("Исходный каталог автомобилей: \n"); foreach (AutoShop a in dic) Console.WriteLine(a); Console.WriteLine("\nТеперь автомобили отсортированны по стоимости: \n"); dic.Sort(); foreach (AutoShop a in dic) Console.WriteLine(a); Console.ReadLine(); > > > 

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

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