Вы находитесь на странице: 1из 7

Символни низове

Много често се налага да работим с текст, а не само символ. Използвайки знанията си до


момента, можем да направим масив от знаци в който да четем и да отработваме текстови данни.
Недостатъкът на това решение е че имаме нужда да използваме основни операции с текст – търсене на
текст, вмъкване, изтриване, форматиране и други, а нямаме такива готови операции, които да работят с
масиви.
В Java съществува вграден тип данни, който ни позволява да работим с текст.
Това е типът String и се използва за променливи, които съхраняват текст под формата на символен низ.
Друг такъв тип данни е StringBuilder, който ще разгледаме по – късно.

1. Логическо описание на String - Крайна (евентуално празна) редица от символи заградени от кавички
се нарича символен низ, знаков низ или само низ. Броят на символите в редицата се нарича дължина
на низ . Низ с дължина 0 се нарича празен низ.
Пример: “abc” - символен низ с дължина 3 ,
“This is a string” е символен низ с дължина 17,
а “” е празен низ.

2. Декларация, инициализация, въвеждане и извеждане от конзолата


Символните низове се създават, като се създаде променлива от тип String и се инициализира с тестов
литерал с двойни кавички:
а) деклариране
тип име;
String sometext1;
sometext1=“по-късно“;
String sometext=“Примерен текст, записан в променлива от тип String“;
б) извеждане в конзолата на променлива от тип String:
System.out.println(sometext);

! За да прочетем низ от конзолата, използваме отново класа Scanner и метода nextLine(), който ще ни
прочете един цял ред и ще ни го върне като резултат.
System.out.println(“Въведете текст”);
Scanner sc=new Scanner(Sytem.in);
String LineofText=sc.nextLine();
System.out.println(“Вие въведохте : ” +LineofText);
Резулататът от този код е :
Въведете текст
Здравей, как е?
Вие въведохте : Здравей, как е?
Когато въвеждаме символен низ, по този начин, след всяко натискане на клавиша Enter, методът
nextLine() ще ни прочита по един ред и ще ни го връща като резултат.
В горния пример прочитаме само един ред и го записваме в променливата LineofText.
! Друг начин да въведем символен низ от конзолата, е чрез метода next() на скенера. Така можем да
четем даден низ от конзолата до срещане на интервал. Това може да ни е от полза, когато на един
ред имаме текст заедно с друг тип данни (примерно числа) и бихме искали да запазим и двата типа като
отделни променливи. Трябва да внимаваме само ако в низа има интервали, защото частта от низа след
първия интервал няма да бъде прочетена от next() . Пример за използване на метода next():

System.out.println(“Въведете име и години разделени с интервал”);


Scanner sc=new Scanner(Sytem.in);
String name=sc.next();
int age=sc.nextInt();
System.out.print(name+ “ е на ” +age+ “ години ”);
Резулататът от този код е :
1
Въведете име и години разделени с интервал
Борис 45
Борис е на 45 години

2. Основни операции със символни низове


а) намиране на дължина на символен низ: можем да намерим дължината на символен низ чрез метода
length():
Scanner sc=new Scanner(System.in);
String text=sc.nextLine();
System.out.print("Дължината на текста е " +text.length());
int d= text.length();
Резулататът от този код е :
This is s string.
Дължината на текста е 17
б) достъп и обхождане на символите от даден низ
Както казахме, променливите от тип String представляват своеобразни масиви от символи. Това
означава, че всеки символ се намира в определена клетка, която има индекс. Номерацията на клетките
започва от нула и завършва до дължината на низа – 1. Можем да прочетем знак на дадена позиция в низ
като използваме метода charAt(index).
Scanner sc=new Scanner(System.in);
String text="Здравей аз съм текст, идвам с мир!";
System.out.println("Петият знак е " +text.charAt(4));
Резулататът от този код е :
Петият знак е в
Щом можем да вземем знак на определена позиция и след като знаем как са номерирани знаците в
символния низ, то тогава можем да обходим всички елементи на един String чрез цикъл for по всички
валидни индекси и след това с метода charAt(index) да вземем поредният символ, но не и да го
променим.
Scanner sc=new Scanner(System.in);
String text="Здравей аз съм текст, идвам с мир!";
for(int i=0;i<text.length();i++)
//извеждаме всички знаци на отделен ред
System.out.println(text.charAt(i));
Резултатът от този код е: всяка буква на отделен ред.
Задача пример: Да се преброи броя думи в подаден текст.
Анализ на решението: Ще считаме че думите са последователност от символи, разделени с интервал.
Няма да вземе предвид препинателни знаци, цифри и други символи за разделители между думите. В
този си вид задачата се свежда до това, да преброим интервалите, които разделят думите. Ще започнем
броенето от 1, защото преди първата дума няма интервал, затова предварително я включваме в
бройката. След това ще обиколим всички символи и ще проверим всеки символ за равенство със знака
за интервал, представен като стойност от тип знак (char).

Scanner sc=new Scanner(System.in);


//прочитаме текста от конзолата
String text=sc.nextLine();
//започваме от 1, защото имаме поне една дума
int wordcount=1;
//за всички символи
for(int i=0;i<text.length();i++){
//в случай че открием интервал, то това ще е началото за нова
дума

2
if (text.charAt(i)==' ') {wordcount++;}
//System.out.println("Броят на думите е " +wordcount);
}
System.out.println("Броят на думите е " +wordcount);
}
}

в) слепване (конкатенация) на низове


Можем да получим низ като резултат от долепването на два други низа един с друг. За тази цел
използваме метода concat(), който приема като параметър друг и връща стойност нов трети низ.
String first=”Just ”;
String sec=”do it.”;
String new1= first.concat(sec);
System.out.print(first.concat(sec));
//Можем ли да го предадем, като стойност на нов низ!!! Изследвайте!

За да постигнем същото по–често използваме операторът „+“ , който прави абсолютно същото и
резултатъ отново е String, който съдържа двата низа:
String first=”Just ”;
String sec=”do it.”;
System.out.print(first+sec);
г) сравняване на низове
Ако имаме следният пример
String a="Text";
String b="Text";
System.out.println(a==b); // извежда true
Може лесно да допуснем, че низовете може да се сравняват с оператора „==“. Но това не винаги е вярно
и затова използваме друг по – правилен начин за сравнение.
г) сравнение на низове с метода equals(). Той проверява дали стойността на два символни низа
съвпада.
String a="Text";
String b="Texa";
System.out.println(a.equals(b));//резултатът ще бъде true
г) сравнение на низове с метода equalsIgnoreCase();
Можем да сравним два низа, без значение дали в тях се съдържат големи или малки букви.
String a=new String("Text");
String b= new String("tExT");
System.out.println(a.equalsIgnoreCase(b));//резултатът ще бъде true
независимо от разликата в големи и малки букви.
г) сравнение на низове с метода compareTo();
Методът compareTo(), сравнява два низа като ни връща кой от тях е по–големият. За да разберем дали
един текст е „по–голям“ от друг, трябва да сравним лексикографски. Методът сравнява всеки символ
от първият текст със съответният символ на същата позиция от вторият текст. Ако символите са
различни, методът връща разликата в поредните им номера в таблицата с char литерали. Методът
връща число от тип int, като са изпълнени следните условия:
 Ако низът, върху който извикваме метода, е по–малкият, то резултатът е число, по–малко от
нула.
 Ако двата низа са еднакви, то резултатът е точно нула.
 Ако низът върху който извикваме метода, е п –големият, то резултатът е число по–голямо от
нула.
Примери:
String string1=”Петър плет плете.”;
3
String string2=”Какво е Java?”; //
String string3=”Да програмираш или да мързелуваш, това е въпросът.”;
//положителен резултат , защото първият стринг е лексикографски по – голям от втория. Резултатът ще
е id-то на char “П” и char “К”
int result1=string1.compareTo(string2);
System.out.println(result1);
//негативен резултат защото третия стринг лексикографски е по–малък от втория
int result2=string3.compareTo(string2);
System.out.println(result2);
// ще изведе 0 защото сравнява първият стринг съвпада с първия
int result3=string1.compareTo(string1);
System.out.println(result3);

д) методите toLowerCase() и toUpperCase()


Двойката методи toLowerCase() и toUpperCase() се използват, за да получим нов низ като всички букви
са обърнати само в малки(toLowerCase()) или само в главни (toUpperCase()) . Не трябва да забравяме, че
оригиналният низ остава непроменен , а новополученият низ ни се връща като резултат от метода и ние
трява да си ги запишем в нова или в същата променлива.
String text=”Примерен текст с Малки и ГолеМи БукВи”;
// преобразуваме текста, като сменяме големите букви с малки
System.out.println(text.toLowerCase());
// преобразуваме текста, като сменяме малките букви с големи
System.out.println(text.toUpperCase());

Резултат:
примерен текст с малки и големи букви
ПРИМЕРЕН ТЕКСТ С МАЛКИ И ГОЛЕМИ БУКВИ

e) допълнителни операции върху низове


е) split() – използваме метода split() , за да разделим даден текст по даден разделител. Като резултат
ще получим масив от String стойности, които представляват част на оригиналният текст, разделени от
разделителя. Примерно по даден текст от думи, разделени със запетая , ще получим масив от всички
думи.
String txt=”Иван, Йордан, Стефка, Иванка”;
//разделяме със запетая и получаваме масив от низове с всички имена като отделни елементи от масива
String[] names=txt.split(“,”);
for(int i=0;i<names.length;i++){
System.out.println(names[i]); }
Резултат: Иван
Йордан
Стефка
Иванка
е) join() – методът join() работи по точно обратният начин на методът split() – по даден разделител и
масив от String стойности, ни връща String, резултат от слепването на низовете в масива, разделени с
подаденият разделител. Примерно по дадени думи може да получим текст , като думите ще са
разделени с точка и запетая.
Пример:
Scanner sc=new Scanner(System.in);
//имена, разделени със запетая в масив от низове
String[] names={"Иван","Йордан", "Стефка", "Иванка"};
//съединяваме низовете като ги разделяме с „ ; “
String txt=String.join(";",names);
System.out.println(txt);
4
Резултат: Иван;Йордан;Стефка;Иванка

е) replace() – върху даден низ да заменим всички срещания на даден подниз с друг.
String txt=”C++ е страхотен език за програмиране и на C++ се пише по-лесно.”;
String correctedtxt=txt.replace(“C++”,”Java”);
System.out.println(“Коригираният текст е: ” +correctedtxt);
System.out.println(“Оригиналният текст е: ” +txt);

е) substring() - Използваме метода substring(), за да извлечем някаква част (подниз) от даден низ.
Методът приема един аргумент – началният индекс, от който да започне вземането на подниза. От там
до края на низа се извлича подниз, който ни се връща като резултат. Имаме и втор вариант на метода,,
който приема и крайната позиция. Важното тук да отбележим, че извлеченият подниз съдържа знаците
на позиции от началото до края -1.
Пример:
String text=”Днес е хубав ден за работа с низове”;
System.out.println(text.substring(5)); // извежда от 6тия знак до края (от този индекс 5)
Резултат:
е хубав ден за работа с низове
е) trim() – използваме метода trim() за да премахнем интервалите в началото и края на даден низ.
Празните пространства, оградени от други знаци, няма да бъдат премахнати. Методът не приема
аргументи . Важно е отново да отбележим, че методът модифициара оригиналният низ , а връща като
резултат нов. Ето пример за това:
String originaltext=” Текст с празни пространства в началото и края. ”;
// премахваме интервалите в краищата и записваме резултата в нова променлива
String trimmedtext=originaltext.trim();
System.out.println(trimmedtext);
е) indexOf() – използваме методът indexOf() за да намерим първата позиция, на която даден низ се
среща в друг. Методът може да приеме параметър от тип String или параметър от тип char, съответстващ
на това което ще търсим. Имаме и друга форма на метода, която приема началната позиция, от която да
започнем търсенето. Можем да използваме този метод, за да разберем дали в текста се съдържа някаква
дума, знак или цял друг текст. Ако избраният знак не се съдържа в текста, методът връща стойност -1.
Следните примери:
String text="Програмирането е изкустовo на мисълта";
System.out.println(text);
//намираме къде в думата се намира думата изкуство. Резултатъt е от
тип цяло число.
int artposition=text.indexOf("изкуство"); //17
System.out.println("Думата 'изкуствo' се среща на" +artposition);
//намира позицията на знакът „е“ в текста
int isposition=text.indexOf("e"); //11
System.out.println("Буквата 'е' се среща на позиция:" +isposition);
//намира позицията на знакът „o“ в текста
int oposition=text.indexOf("o");//-1
if (oposition==-1) {
System.out.println("Буквата 'o' не се среща в текста") ;
}
else{
System.out.println("Буквата 'o' се среща на позиция" +oposition);
}

Demo:
package klas9a_b;
import java.util.Scanner;
public class String_zad {

5
public static void main(String[] args) {
// TODO Auto-generated method stub
String str;//sazdava niz
Scanner inp=new Scanner (System.in);

str=inp.nextLine();//prochita

System.out.println(str);//izvejda

int d=str.length();
System.out.println(d);//izvejda daljinata

char ch= str.charAt(5);


System.out.println(ch);//izvejda znak v pozicia 5
for(int i=0;i<str.length();i++)
//извеждаме всички знаци на отделен ред
System.out.println(str.charAt(i));

int wordcount=1;
//за всички символи
for(int i=0;i<str.length();i++){
//в случай че открием интервал, то това ще е началото за нова дума
if (str.charAt(i)==' ') {wordcount++;}
//System.out.println("Броят на думите е " +wordcount);
}
System.out.println("Броят на думите е " +wordcount);
//слепване на низове
String str1=" Privet";
System.out.println(str.concat(str1));
String str2=str.concat(str1);
System.out.println(str2);
//sravnavane
boolean ravnili=(str==str1);//ще е Т ако са ражни и F ако не са
System.out.println(str.equals(str1));//ще е Т ако са ражни и F ако не
са
//резултатът ще бъде true независимо от разликата в големи и малки
букви.
System.out.println(str.equalsIgnoreCase(str1));
//sravnava leksikografski, - parvi po-malyk, 0 ravni, _ parvi po-golam
int result1=str.compareTo(str1);
System.out.println(result1);

Задача 1: Програма, която намира колко пъти въведен от клавиатурата символ се среща в символен низ.
Scanner sc=new Scanner(System.in);
String text=sc.nextLine();
char bukva= sc.next().charAt(0);
int br=0;
for(int i=0;i<text.length();i++){
if (text.charAt(i)==bukva){ br++;}

}
6
System.out.print("Броят на символите e =" +br);
}

}
Реултат:
Just do it.
t
Броят на символите e =2

Вам также может понравиться