Читайте также:
|
|
Расстояние между символами A,Z = -25
Расстояние между символами a,A = 32
Расстояние между символами Я,А = 31
Аналізуючи ці результати, можна зрозуміти, що в кодуванні Unicode як латиниця, так і кирилиця щільно впаковані. Виключення становить російська літера "Ё" - велика й маленька - вони випадають із щільного кодування Малі літери в кодуванні безпосередньо слідують за великими літерами. Відстань між алфавітами в кодуванні досить велика - російська літера "А" на 975 символів правіше в кодуванні, ніж відповідна літера в латинському алфавіті.
3.3. Клас Char[ ] - масив символів
У мові С# визначений клас Char[ ]. і його можна використовувати для подання рядків постійної довжини. Крім того, оскільки масиви в С# динамічні, то можна використовувати масиви символів для подання рядків.
Масив char[ ] - це звичайний масив, його не можна ініціалізувати рядком символів. Константа, що задає рядок символів, належить класу String, а в С# не визначені взаємні перетворення між класами String й Char[ ]. У класу String є динамічний метод ToCharArray, що задає перетворення рядка символів у масив.
Клас Char[ ] є спадкоємцем не тільки класу Object, але й класу Array, і тому має всі методи батьківських класів. Деякі перевантажені методи класу Array можна розглядати як операції над рядками. Методи IndexOf. LastlndexOf дозволяють визначити індекси першого і останнього входження в рядок деякого символу. Однак їх не можна використовувати для знаходження індексу входження підрядка в рядок.
3.4. Клас String
Основним типом при роботі з рядками є тип string (синонім класу String), що задає рядки змінної довжини. Клас String у мові С# відноситься до посилальних типів. Над рядками - об'єктами цього класу - визначений широкий набір операцій.
Об'єкти класу String оголошуються з явною або відкладеною ініціалізацією, з явним або неявним викликом конструктора класу. Найчастіше при оголошенні рядкової змінної конструктор явно не викликається, а ініціалізація задається рядковою константою. У класу String багато конструкторів. Вони дозволяють сконструювати рядок з:
- символу, повтореного задане число раз;
- масиву символів char[ ];
- частини масиву символів.
Приклади оголошення рядків:
string world = "Мир"; //I конструктори
// string s1 = new string("s1"); - не припустимо
// string s2 = new string(); - не припустимо
string sssss = new string('s', 5);
char[] yes = "Yes".ToCharArray();
string stryes = new string(yes);
string strye = new string(yes, 0, 2);
Console.WriteLine("\nworld={0}; sssss={1}; stryes={2}; strye= {3}",
world, sssss, stryes, strye);
string stry = new string(yes, 1, 2);
Console.WriteLine("world={0}; sssss={1}; stryes={2}; stry= {3}",
world, sssss, stryes, stry);
Об'єкт world створений без явного виклику конструктора, а об'єкти sssss, stryes, strye створені різними конструкторами класу String.
Не допускається явний виклик конструктора за замовчуванням - конструктора без параметрів. Немає також конструктора, якому як аргумент можна передати звичайну рядкову константу. Відповідні оператори в тексті прикладу закоментовані.
Над рядками визначені наступні операції:
- присвоювання (=);
- дві операції перевірки еквівалентності (= =) і (!=);
- конкатенація або зчеплення рядків (+);
- узяття індексу ([ ]).
Бінарна операція "+" зчіплює два рядки, приписуючи другий рядок до кінця першого.
Можливість узяття індексу при роботі з рядками відбиває той факт, що рядок можна розглядати як масив й одержувати кожен його символ. Кожен символ рядка має тип char, доступний тільки для читання але не для запису.
Приклад, у якому над рядками виконуються наведені операції:
string s1 = "ABC", s2 = "CDE";
string s3 = s1 + s2;
bool b1 = (s1!= s2);
char ch1 = s1[0];
ch2 = s2[0];
Console.WriteLine("\ns1={0}, s2={1}, b1={2}, ch1={3}, ch2={4}",
s1, s2, b1, ch1, ch2);
s2=s1;
b1 = (s1!= s2);
ch2 = s2[0];
Console.WriteLine("s1={0}, s2={1}, b1={2}, ch1={3}, ch2={4}",
s1, s2, b1, ch1, ch2);
У мові C# існують два види рядкових констант:
- звичайні константи, які представляють рядок символів, вкладений в лапки;
- @-константи, задані звичайною константою с попереднім знаком @.
У звичайних константах деякі символи можуть задаватися у вигляді escape-послідовностей. Для таких цілей використовується комбінація символів, що починається символом "\" - зворотна коса риска. Так. пари символів: "\n", "\t", "\\", "\"" задають відповідно символ переходу на новий рядок, символ табуляції, сам символ зворотної косої риски, символ лапок, що вставляється в рядок, але не сигналізує про її закінчення. Комбінація " \xNNNN " задає символ, визначений шістнадцятковим кодом NNNN Іноді виникають незручності; наприклад, при задаванні констант, що визначають шлях до файла, доводиться щораз подвоювати символ зворотної косої риски. Це одна із причин, які обумовлюють появу @-константи.
У @-константах всі символи трактуються в повній відповідності з їх зображенням. Тому шлях до файла краще задавати @-константою.
Статичні методи й властивості класу String наведені у таблиці 3.2
Таблиця 3.2 - Статичні методи й властивості класу String
Метод | Опис |
Empty | Повертається порожній рядок. Властивість зі статусом read only |
Compare | Порівняння двох рядків. Метод перевантажений. Реалізації методу дозволяють порівнювати як рядки, так і підрядки. При цьому можна враховувати або не враховувати регістр, особливості національного форматування дат, чисел і т.д. |
CompareOrdinal | Порівняння двох рядків. Метод перевантажений. Реалізації методу дозволяють порівнювати як рядки, так і підрядки. Порівнюються коди символів |
Concat | Конкатенація (зчеплення) рядків. Метод перевантажений, допускає зчеплення довільного числа рядків |
Copy | Створюється копія рядка |
Format | Виконує форматування відповідно до заданих специфікацій формату |
Join | Конкатенація масиву рядків у єдиний рядок. При конкатенації між елементами масиву вставляються роздільники. Операція, задана методом Join, є оберненою до операції, заданої методом Split. Останній є динамічним методом й, використовуючи роздільники, здійснює поділ рядка на елементи |
Динамічні методи класу String.
Методи класу String дозволяють виконувати вставку, видалення, заміну, пошук входження підрядка в рядок. Клас String успадковує методи класу Object частково їх перевизначаючи.
Методи, наведені у таблиці 3.3, дають досить повну картину можливостей, доступних при роботі з рядками в С#. Варто пам'ятати, що клас String є незмінним. Тому Replace, Insert та інші методи являють собою функції, що повертають новий рядок як результат і не змінюють рядок, що викликав метод.
Таблиця 3.3 - Динамічні методи і властивості класу string
Метод | Опис |
Insert | Вставляє підрядок в задану позицію |
Remove | Видаляє підрядок в заданій позиції |
Replace | Заміняє підрядок в заданій позиції на новий підрядок |
Substring | Виділяє підрядок в заданій позиції |
IndexOf, IndexOfAny, LastindexOf, LastindexOfAny | Визначаються індекси першого і останнього входження заданого підрядка або будь-якого символу із заданого набору |
StartsWith, EndsWith | Повертається true або false залежно від того, починається або закінчується рядок заданим підрядком |
PadLeft, PadRight | Виконує набивання потрібною кількістю пробілів на початку і наприкінці рядка |
Trim, TrimStart, TrimEnd | Зворотні операції до методів Pad. Видаляються пробіли на початку і наприкінці рядка, або тільки з одного його кінця |
ToCharArray | Перетворення рядка в масив символів |
3.5. Клас StringBuilder
Клас StringBuilder - побудовник рядків. Клас String не дозволяє змінювати існуючі об'єкти. Рядковий клас StringBuilder дозволяє компенсувати цей недолік. Цей клас належить до змінюваних класів і його можна знайти в просторі імен System.Text.
Оголошення рядків. Конструктори класу StringBuilder.
Об'єкти цього класу оголошуються з явним викликом конструктора класу. Оскільки спеціальних констант цього типу не існує, то виклик конструктора для ініціалізації об'єкта необхідний. Конструктор класу перевантажений, і поряд з конструктором без параметрів, що створюють порожній рядок, є набір конструкторів, яким можна передати дві групи параметрів. Перша група дозволяє задати рядок або підрядок, значенням якого буде ініціалізуватися створюваний об'єкт класу StringBuilder. Друга група параметрів дозволяє задати розмір об'єкта - обсяг пам'яті, що відводиться даному екземпляру класу StringBuilder. Кожна із цих груп не є обов'язковою й може бути опущена. Прикладом може служити конструктор без параметрів, що створює об'єкт, ініціалізований порожнім рядком, і з деяким розміром, заданим за замовчуванням, значення якого залежить від реалізації. Приклад синтаксису конструкторів:
public StringBuilder (string str, int cap).
Параметр str задає рядок ініціалізації, cap - розмір об'єкта;
public StringBuilder (int curcap, int maxcap).
Параметри curcap й maxcap задають початковий і максимальний розмір об'єкта;
public StringBuilder (string str, Int start, int len, Int cap).
Параметри str, start, len задають рядок ініціалізації, cap – розмір об'єкта.
Для цього класу не можна використовувати просте присвоювання:
StringBuilder s="abc"; // Неправильної
У цьому випадку необхідно записати так:
StringBuilder s = new StringBuilder("abc"); // Правильно
Операції над рядками. Над рядками цього класу визначені практично ті ж операції з тією ж семантикою, що й над рядками класу String, однак, операція конкатенації (+) не визначена над рядками класу StringBuilder, її роль грає метод Append, що дописує новий рядок в кінець уже існуючого.
З рядком цього класу можна працювати як з масивом, але, на відміну від класу String, тут допускається не тільки читання окремого символу, але і його зміна.
Приклад
// Рядки класу StringBuilder. Операції над рядками
StringBuilder ss1 = new StringBuilder("ABC"),
ss2 = new StringBuilder("CDE");
StringBuilder ss3 = new StringBuilder();
ss3 = ss1.Append(ss2); // s3= s1+s2;
bool bs1 = (ss1 == ss3);
char chs1 = s1[0], chs2 = ss2[0];
Console.WriteLine("\nss1={0}, ss2={1}, bs1={2}, chs1={3}, chs2={4}",
ss1, ss2, bs1, chs1, chs2);
ss2 = ss1;
bs1 = (ss1!= ss2);
chs2 = ss2[0];
Console.WriteLine("ss1={0}, ss2={1}, bs1={2},chs1={3}, chs2={4}",
ss1, ss2, bs1, chs1, chs2);
StringBuilder ss = new StringBuilder("Zenon");
ss[0] = 'L';
Console.WriteLine(ss);
Цей приклад демонструє можливість виконання над рядками класу StringBuilder тих же операцій, що й над рядками класу String. У результаті присвоювання створюється додаткове посилання на об'єкт, операції перевірки на еквівалентність працюють зі значеннями рядків, а не з посиланнями на них. Конкатенацію можна замінити викликом методу Append. З'являється нова можливість – змінювати окремі символи рядка. Для того, щоб ім'я класу StringBuilder стало доступним, у проект доданий рядок
using System.Text, що посилається на відповідний простір імен. Результати роботи наведені нижче:
ss1=ABCCDE, ss2=CDE, bs1=True, chs1=A, chs2=C
ss1=ABCCDE, ss2=ABCCDE, bs1=False,chs1=A, chs2=A
Lenon
Основні методи і властивості. У класу є основні методи, що дозволяють виконувати такі операції над рядком як вставка, видалення та заміна підрядків, але немає методів, подібних до пошуку входження, які можна виконувати над звичайними рядками. Технологія роботи звичайно така: конструюється рядок класу StringBuilder; виконуються операції, що вимагають зміни значення; отриманий рядок перетвориться в рядок класу String; над цим рядком виконуються операції, що не вимагають зміни значення рядка. У класу StringBuilder немає статичних методів. Всі його методи динамічні.
Основні методи класу StringBuilder:
- public StringBuilder Append (<об'єкт>). До рядка, який викликав метод, приєднується рядок, отриманий з об'єкта, що переданий методу як параметр. Метод перевантажений і може приймати на вході об'єкти всіх простих типів, починаючи від char й bool до string й long. Оскільки об'єкти всіх цих типів мають метод ToString, завжди є можливість перетворити об'єкт у рядок, який і приєднується до вихідного рядка. Як результат повертається посилання на об'єкт, що викликав метод. Оскільки повернене посилання нічому присвоювати не потрібно, то вірніше вважати, що метод змінює значення рядка;
- public StringBuilder Insert (int location,<об’єкт>). Метод вставляє рядок, отриманий з об'єкта, у позицію, зазначену параметром location. Метод Append є частковим випадком методу Insert;
- public StringBuilder Remove (int start, int leri). Метод видаляє підрядок довжини lеn, що починається з позиції start;
- public StringBuilder Replace (string strl, string str2). Всі входження підрядка strl заміняються на рядок str2;
- public StringBuilder AppendFormat (<рядок форматів>, „об’єкти”). Метод є комбінацією методу Format класу String і методу Append. Рядок форматів, переданий методу, містить тільки специфікації форматів. Відповідно до цих специфікацій знаходяться і форматуються об'єкти. Отримані в результаті форматування рядки приєднуються в кінець вихідного рядка.
Приклади використання основних властивостей і методів класу StringBuilder:
//Властивість Length. Повертає довжину рядка:
int k=s.Length;
//Метод Append. Додає рядок до існуючого:
StringBuilder sb1=new StringBuilder("Cogito ");
StringBuilder sb2=new StringBuilder("ergo ");
sb1.Append(s2);
sb1.Append("sum");
Console.WriteLine();
Console.WriteLine(sb1);
// Надрукується "Cogito ergo sum"
// Я мислю, значить я існую
//Метод Equals. Слугує для порівняння двох рядків. Повертає true або false.
if(sb1.Equals(sb2)) Console.WriteLine("Рядки рівні");
else Console.WriteLine("Рядки не рівні");
//Метод Insert. Вставляє символи в задану позицію (нумерація йде з нуля):
StringBuilder sb3=new StringBuilder("abcde");
sb3.Insert(2, "xyz");
Console.WriteLine(sb3); // Надрукується "abxyzcde"
//Метод Remove. Видаляє символи з рядка:
StringBuilder sb4=new StringBuilder("abcde"); sb4.Remove(1, 2);
Console.WriteLine(sb4); // Надрукується "ade"
Console.ReadKey();
Перший параметр в Remove визначає, з якої позиції видаляти (нумерація з нуля), другий - скільки символів видаляти.
Метод Replace. Заміняє символи:
StringBuilder sr = new StringBuilder("abcdeabcde");
sr.Replace("abc", "ZZZ");
Console.WriteLine(sr); // Надрукується "ZZZdeZZZde"
За винятком методу Remove, всі розглянуті методи є перевантаженими.
Ємність буфера. Кожен екземпляр рядка класу StringBuilder має буфер, у якому зберігається рядок. Обсяг буфера – його ємність – може мінятися в процесі роботи з рядком. Об'єкти класу мають дві характеристики ємності – поточну й максимальну. У процесі роботи поточна ємність змінюється в межах максимальної ємності. Якщо розмір рядка збільшується, то відповідно автоматично росте й поточна ємність. Якщо ж розмір рядка зменшується, то ємність буфера залишається на тому ж рівні. Із цієї причини іноді правильно зменшувати ємність. Спроба зменшити ємність до величини, меншої довжини рядка, Веде ДС' помилки.
У класу StringBuilder є дві властивості та один метод, що дозволяють аналізувати й керувати ємнісними властивостями буфера. Цими характеристиками можна керувати також ще на етапі створення об'єкта, – для цього є відповідний конструктор. Розглянемо властивості і метод класу, пов'язані з ємністю буфера:
- властивість Capacity – повертає або встановлює поточну ємність буфера;
- властивість MaxCapaclty – повертає максимальну ємність буфера (максимальна кількість символів, які можна записати в об'єкт типу StringBuilder).
Методint EnsureCapacity (int capacity) – дозволяє зменшити ємність буфера. Метод намагається спочатку встановити ємність, задану параметром capacity; якщо це значення менше розміру збереженого рядка, то ємність установлюється такою, щоб гарантувати розміщення рядка. Це число повертається як результат роботи методу.
Дата добавления: 2015-10-02; просмотров: 59 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Горизонтальная работа или работа с Малым Арканом | | | Рассылается: ТЧ, ТЧЗЭмфбв, ТЧэксп |