830 likes | 1.06k Views
Разработал к.т.н. Фофанов О.Б. Работа со строками. В пакет java.lang встроен класс, инкапсулирующий структуру данных, соответствующую строке . Класс String - объектное представление неизменяемого символьного массива ( статические строки). Работа со строками.
E N D
Разработал к.т.н. Фофанов О.Б. Работа со строками • В пакет java.lang встроен класс, инкапсулирующий структуру данных, соответствующую строке. • КлассString - объектное представление неизменяемого символьного массива (статические строки). JAVA, Кафедра ОСУ, АВТФ
Работа со строками • В этом классе есть методы, которые позволяют сравнивать строки, осуществлять в них поиск и извлекать определенные символы и подстроки. • Класс StringBuffer используется тогда, когда строку после создания требуется изменять (динамические строки). JAVA, Кафедра ОСУ, АВТФ
Работа со строками • Можно создавать объекты типа String с помощью оператора new. • Для создания пустой строки используется конструктор без параметров: • String s = newString(); • String str = newString("какая-то строка"); JAVA, Кафедра ОСУ, АВТФ
Работа со строками • String() — создается объект с пустой строкой; • String (String str) — из одного объекта создается другой • String (StringBuffer str) — преобразованная копия объекта класса BufferString; • String(byte[] byteArray) — объект создается из массива байтов byteArray (ASCII); • String (char [] charArray) — объект создается из массива charArray символов Unicode; JAVA, Кафедра ОСУ, АВТФ
Работа со строками • String (byte [] byteArray, int offset, int count) — объект создается из части массива байтов byteArray, начинающейся с индекса offset и содержащей count байтов; • String (char [] charArray, int offset, int count) — то же, но массив состоит из символов Unicode; • String(byte[] byteArray, String encoding) — символы, записанные в массиве байтов, задаются в Unicode-строке, с учетом кодировки encoding; (СР1251, СР866, KOI8, MacCyrillicи тд) winLikeWin = new String(bytearr, "Cp1251"); • String(byte[] byteArray, int offset, int count, String encoding) — то же самое, но только для части массива. JAVA, Кафедра ОСУ, АВТФ
Работа со строками char chars[] = { 'a', 'b', 'с', 'd', 'e', 'f' }: String s = newString(chars,2,3); // s=“cde” JAVA, Кафедра ОСУ, АВТФ
Работа со строками char chars[] = { 'а', 'b', 'с' }; String s = newString(chars); // s= “abc “ JAVA, Кафедра ОСУ, АВТФ
Работа со строками ВJava включено несколько синтаксических дополнений, цель которых—помочь программистам в выполнении операций со строками. В числе таких операций создание объектов типа String, слияние нескольких строк и преобразование других типов данных в символьное представление. JAVA, Кафедра ОСУ, АВТФ
Работа со строками • String s = "abc";//упрощенный вариант • Один из общих методов, используемых с объектами String—метод length(), возвращающий число символов в строке String s = "abc"; System.out.println(s.length()); System.out.println("abc".length()); /*для каждой строки-литерала создается свой представитель класса String */ JAVA, Кафедра ОСУ, АВТФ
Слияние строк String s = “Не is” + age + " years old."; //String s = newStringBuffer("He is "). // append(age); //s.append(" years old.").toString(); JAVA, Кафедра ОСУ, АВТФ
Слияние строк • По определению каждый объект класса String не может изменяться. • Нельзя ни вставить новые символы в уже существующую строку, ни поменять в ней одни символы на другие. • И добавить одну строку в конец другой тоже нельзя. • Поэтому транслятор Java преобразует операции, выглядящие, как модификация объектов String, в операции с родственным классом StringBuffer. JAVA, Кафедра ОСУ, АВТФ
Извлечение символов • Чтобы извлечь одиночный символ из строки, можно сослаться непосредственно на индекс символа в строке с помощью метода charAt: publicchar charAt(int index) Выбирает из строки символ с индексом index (символы индексируются от нуля). str="JAVA"; str = str + "C";//str="JAVAC"; charch = str.charAt(2); //ch='V' JAVA, Кафедра ОСУ, АВТФ
Извлечение символов • Если нужно извлечь несколько символов, можете воспользоваться методом getChars(int start,int end, char buf, int index) String s = "This is a demo of the getChars method."; int start = 10; int end = 14; JAVA, Кафедра ОСУ, АВТФ
Извлечение символов char buf[] = newchar [end—start]; s.getChars(start, end, buf, 0); System.out.println(buf); // “demo” } } JAVA, Кафедра ОСУ, АВТФ
Сравнение • методequals() Логический метод equals (Stringstr) , , возвращает true , если аргумент str не равен null, и строка, содержащаяся в нем, полностью идентична строке,вызывающей этот метод вплоть до совпадения регистра букв. В остальных случаях возвращается значение false . • методequalsIgnoreCase() JAVA, Кафедра ОСУ, АВТФ
Сравнение String s1="Hello"; String s2="Hello"; String s3="Good-bye"; String s4="HELLO"; System.out.println(s1+"equals"+s2+"->“ +s1.equals(s2)); JAVA, Кафедра ОСУ, АВТФ
Сравнение System.out.println(s1+"equals"+s3+"->“ +s1.equals(s3)); System.out.println(s1+"equals"+s4+"->“ +s1.equals(s4)); System.out.println(s1+"equalsIgnoreCase"+ s4+"->"+ s1.equalsIgnoreCase(s4)); JAVA, Кафедра ОСУ, АВТФ
Сравнение Hello equals Hello -> true Hello equals Good-bye -> false Hello equals HELLO -> false Hello equalsIgnoreCase HELLO -> true JAVA, Кафедра ОСУ, АВТФ
Сравнение • Метод equals() и оператор == выполняют две совершенно различных проверки. • Mетод equals сравнивает символы внутри строк • Оператор == сравнивает две переменные-ссылки на объекты и проверяет, указывают ли они на разные объекты или на один и тот же. JAVA, Кафедра ОСУ, АВТФ
Сравнение String str1 = "string"; String str2 = "string"; System.out.println(str1==str2 ? "the same" : "not the same"); Ответ: "the same". Что означает, что ссылки на строки равны. Это сделано на уровне компилятора, очевидно, для экономии памяти. Компилятор создает ОДИН экземпляр строки, и присваивает str1 и str2 ссылку на этот экземпляр (ТОЛЬКО ДЛЯ ЛИТЕРАЛОВ-СТРОК) JAVA, Кафедра ОСУ, АВТФ
Сравнение Если скомпоновать строку из кусков, ссылка на нее будет другой. String str1 = "string"; String str2 = "str"; String str3 = "ing"; System.out.println(str1==(str2+str3) ? "the same" : "not the same"); JAVA, Кафедра ОСУ, АВТФ
Сравнение String str1 = "string"; String str2 = newString("string"); System.out.println(str1==str2 ? "the same" : "not the same"); Результатом также будет "not the same". JAVA, Кафедра ОСУ, АВТФ
Сравнение class EqualsNotEqualTo { public static void main(String args[]) { String s1="Hello"; String s2=new String(s1); System.out.println(s1+"equals"+s2+ "->"+s1.equals(s2)); System.out.println(s1+"=="+s2+", ->"+(s1==s2)); } } JAVA, Кафедра ОСУ, АВТФ
Сравнение C:\> java EqualsNotEqualTo Hello equals Hello -> true Hello == Hello -> false JAVA, Кафедра ОСУ, АВТФ
Сравнение • Метод compareTo (String str) возвращает целое число типа int , вычисленное по следующим правилам: • Сравниваются символы данной строки this и строки str с одинаковым индексом, пока не встретятся различные символы с индексом, допустим k , или пока одна из строк не закончится. • В первом случае возвращается значение this.charAt(k) - str.charAt(k), т. е. разность кодировок Unicode первых несовпадающих символов. • Во втором случае возвращается значение this.length() - str.length() , т. е. разность длин строк. • Если строки совпадают, возвращается 0. JAVA, Кафедра ОСУ, АВТФ
Сравнение • если целое значение, возвращенное методом, отрицательно, то строка, с которой был вызван метод, меньше строки-параметра, если положительно—больше. если же метод compareTo вернул значение 0, строки идентичны. JAVA, Кафедра ОСУ, АВТФ
Сравнение 1. String w1 = "cat"; String w2 = "hat"; int comparison = w1.compareTo(w2); // comparison = -5 JAVA, Кафедра ОСУ, АВТФ
Сравнение /** отсортированный в порядке возрастания список строк */ class SortString { staticStringarr[] = {“Иванов”, ‘’Ли’’,….,“Ю” }; public static void main(String args[]) { JAVA, Кафедра ОСУ, АВТФ
Сравнение for (int j = 0; j < arr.length; j++) { for (int i = j + 1; i < arr.length; i++) { if (arr[i].compareTo(arr[j]) < 0) { String t = arr[j]; arr[j] = arr[i]; arr[i] = t; } }// конец цикла i System.out.println(arr[j]); } // конец цикла j } } JAVA, Кафедра ОСУ, АВТФ
Сравнение Сравнивать можно не только целые строки, но и их отдельные части. метод regionMatches() в двух формах: в одной происходит точное сравнение символов, как в методе equals, а в другой — сравнение без учета регистра, как в методе equalsIgnoreCase: • publicbooleanregionMatches(int start, String other, int ostart, intolen) JAVA, Кафедра ОСУ, АВТФ
Сравнение • public booleanregionMatches(boolean ignoreCase, int start, String other, int ostart, intolen) JAVA, Кафедра ОСУ, АВТФ
Сравнение String str = "Look, look!"; boolean b1, b2, b3; b1 = str.regionMatches(6, "Look", 0, 4); b2 = str.regionMatches(true, 6,"Look“,0, 4); b3 = str.regionMatches(true, 6,"Look", 0, 5); JAVA, Кафедра ОСУ, АВТФ
Сравнение • public booleanstartsWith(String prefix, int offset) Возвращает true, если строка начинается с подстроки prefix (со смещением offset). • public boolean startsWith(String prefix) Сокращение для startsWith(prefix, 0). • public booleanendsWith(String suffix) Возвращает true, если строка заканчивается подстрокой suffix. JAVA, Кафедра ОСУ, АВТФ
Поиск • В класс String включена поддержка поиска определенного символа или подстроки, для этого в нем имеются два метода—indexOf(str) и lastIndexOf(str). • Каждый из этих методов возвращает индекс того искомого символа, либо индекс начала искомой подстроки. • В любом случае, если поиск оказался неудачным методы возвращают значение -1. int i = “раскраска ".indexOf ("рас"); int i = "Раскраска ".lastIndexOf ("рас") JAVA, Кафедра ОСУ, АВТФ
Модификация • объекты класса String нельзя изменять, всякий раз, когда модифицируется строка, • нужно копировать ее в объект типа StringBuffer, • использовать один из методов класса String, которые создают новую копию строки, внося в нее изменения. JAVA, Кафедра ОСУ, АВТФ
Модификация • substring(int p) метод создает новую копию символов из того диапазона индексов оригинальной строки, который указан при вызове. Можно указать только индекс первого символа нужной подстроки—тогда будут скопированы все символы, начиная с указанного и до конца строки JAVA, Кафедра ОСУ, АВТФ
Модификация можно указать и начальный, и конечный индексы—при этом в новую строку будут скопированы все символы, начиная с первого указанного, и до (но не включая его) символа, заданного конечным индексом. s = "Hello World".substring(6);// "World" s1 = "Hello World".substring(3,8);//"lo Wo" JAVA, Кафедра ОСУ, АВТФ
Модификация • concat () Слияние, или конкатенация строк выполняется с помощью метода concat. Этот метод создает новый объект String, копируя в него содержимое исходной строки и добавляя в ее конец строку, указанную в параметре метода. str5 = “Guten Tag".concat(“ Welt"); // " Guten TagWelt " JAVA, Кафедра ОСУ, АВТФ
Модификация • replace (char old, char new) Методу replace в качестве параметров задаются два символа. Все символы, совпадающие с первым, заменяются в новой копии строки на второй символ. s1 = "Hello".replace('l' , 'w'); // "Hewwo" JAVA, Кафедра ОСУ, АВТФ
Модификация • toLowerCase() и toUpperCase() Эта пара методов преобразует все символы исходной строки в нижний и верхний регистр, соответственно. st = "Hello".toLowerCase();// "hello" s2 = "Hello".toUpperCase();// "HELLO" JAVA, Кафедра ОСУ, АВТФ
Модификация • trim() метод trim () убирает из исходной строки все ведущие и замыкающие пробелы. s=“Hello World ".trim(); //"Hello World” • valueOf() преобразование любого значения в текстовую строку Такой статический метод определен для любого существующего в Java типа данных JAVA, Кафедра ОСУ, АВТФ
Модификация • может преобразовывать типы: boolean, byte, short, int, long, float, doubleи тип Object • Например: boolean bTmp = true; String s = String.valueOf (bTmp); JAVA, Кафедра ОСУ, АВТФ
Модификация • Кроме того, в каждом классе есть метод toString () , переопределенный или просто унаследованный от класса Object . Он преобразует объекты класса в строку. Фактически, метод valueOf() вызывает метод toString() соответствующего класса. Поэтому результат преобразования зависит от того, как реализован метод toString (). JAVA, Кафедра ОСУ, АВТФ
Модификация • Обратное преобразование, из строки Методparse<Type>()класса-оболочки этого типа, где вместо <Type> будет имя типа. • byte b = Byte.parseByte("10"); • short shrt = Short.parseShort("1234"); • long lng = Long.parseLong("1234567"); • float flt = Float.parseFloat("1.123"); • double dbl = Double.parseDouble("1.123"); • int i = Integer.parseInt("10"); JAVA, Кафедра ОСУ, АВТФ
Класс StringBuffer • Объекты типа StringBuffer представляют собой последовательности символов, которые могут расширяться и модифицироваться JAVA, Кафедра ОСУ, АВТФ
Класс StringBuffer • Создать объект класса StringBuffer можно только конструкторами. Конструкторы В классе StringBuffer три конструктора: StringBuffer () — создает пустой объект с емкостью 16 символов; StringBuffer (int capacity) — создает пустой объект заданной емкости capacity ; StringBuffer (String str) — создает объект емкостью str.length () + 16, содержащий строку str . JAVA, Кафедра ОСУ, АВТФ
Класс StringBuffer • Текущую длину StringBuffer можно определить, вызвав метод length () • Для определения всего места, зарезервированного под строку в объекте StringBuffer нужно воспользоваться методом capacity() JAVA, Кафедра ОСУ, АВТФ
Класс StringBuffer …… StringBuffer sb = newStringBuffer("Hello"); int l = sb.length(); int c = sb.capacity(); // l=5 c =21 JAVA, Кафедра ОСУ, АВТФ
Методы StringBuffer • ensureCapacity () Если нужно после создания объекта StringBuffer зарезервировать в нем место для определенного количества символов, можно для установки размера строки воспользоваться методом ensureCapacity (). Это бывает полезно, когда заранее известно, что придется добавлять к буферу много небольших строк. buf.ensureCapacity(buf.length() + now.length() + 2); JAVA, Кафедра ОСУ, АВТФ
Методы StringBuffer • setLength() Если нужно в явном виде установить длину строки в буфере, можно использовать метод setLength(). Если задать значение, большее чем длина содержащейся в объекте строки, этот метод заполнит конец новой, расширенной строки символами с кодом ноль. JAVA, Кафедра ОСУ, АВТФ