Сегодня мы рассмотрим класс String в Java и напишем класс, с помощью которого можно будет выуживать важные данные из потока строковой информации.
Выглядеть это будет примерно так: допустим, нам дали на вход строку «*^$//ab//ab*^$uha//b//uh», которая содержит важную информацию. И нам нужно выделить из нее подстроку от второго с начала сочетания симвлом “*^$” до третьей начала комбинации из двух слешей. Правильный результат - uha
Это достаточно типовая задача в программировании: когда мы кодируем информацию в файл, нам удобно создавать различные метки, которые говорят о том, где лежит нужнаяч нам информация. Поэтому создав специальный класс, а в нем статический метод, выполняющий подобное, мы значительно облегчим себе жизнь.
Создадим новый класс, назовем его StringWorker. Объявим в нем единственный статический метод fromAtoB c пятью аргументами: str – исходная строка, a-номер вхождения первой подстроки, sa-первая подстрока, b-индекс вхождения второй подстроки, sb-вторая подстрока. Статический метод — такой метод, для вызова которого не нужно создавать экземпляр класса.
public class StringWorker {
public static String fromAtoB(String str, int a, String sa, int b, String sb){
//код метода
}
}
Класс String в Java предназначен для хранения строк. Создать экземпляр класа можно и простым присваиванием: String str=”string”;
Рассмотри основные методы класса String (str-объект класса String):
-str.indexOf(String str2) – возвращает индекс первого вхождения подстроки str в строку str. Например, если str=”abcde”;str2=”cd”, метод вернет 2 (отсчет символов начинается с 0).
-str.charAt(int a) – возвращает символ, индекс которого равен a. Например, если str=”12345”;a=3 , вернет 4.
-str.substring(int begin, int end) – возвращает часть строки от индекса begin до индекса end
-str.length() - возвращает длину строки
Используем это на практике — начинаем программировать наш метод:
String res="";
int begin=0;
int end=str.length();
String copy=str;
String copy2=str;
Сначала объявим переменные. Переменная res-конечный результат, его мы в самом конце возвратим. Begin и end – переменные начала и конца той подстроки, которую мы должны выделить и возвратить. Также сделаем 2 копии исходной строки — они нам понадобятся для обработки.
Алгоритм нахождения начала n-го вхождения подстроки в строку такой:
-в цикле каждую итерацию отрубаем от копии исходной строки начало, не содержащее искомой подстроки + количество символом, равное длине подстроки. Например, если строка «str///s», а подстрока - «///» - нужно оставить только s. Если искомая подстркока не встречается, закончить поиск.
-каждую итерацию цикла уменьшать а на единицу.
-если а==0, запомнить в переменную begin разницу между теперешней длиной строки copy и исходной.
Например, в нашем случае: StringWorker.fromAtoB("*^$//ab//ab*^$uha//b//uh",2,"*^$",3,"//")) итерации будут:
«*^$//ab//ab*^$uha//b//uh» a=2
«//ab//ab*^$uha//b//uh» a=1
«uha//b//uh» a=0
Таким образом, индекс n-го вхождения — разница в длине между
«*^$//ab//ab*^$uha//b//uh» и «uha//b//uh»
Что касается алгоритма для определения переменной end, он будет похож на этот, но, так как нам требуется найти индекс еще до подстроки, а не после, будем еще от end в конце отнимать длину подстроки.
Код:
while(copy.indexOf(sa)!=-1){
copy=copy.substring(copy.indexOf(sa)+sa.length());
a--;
if(a==0) {
begin=str.length()-copy.length();
}
}
while(copy2.indexOf(sb)!=-1){
copy2=copy2.substring(copy2.indexOf(sb)+sb.length());
b--;
if(b==0) {
end=str.length()-copy2.length()-sb.length();
}
}
if(begin<end) {
return str.substring(begin, end);
}
else {
return str.substring(end, begin);
}
Комментариев нет:
Отправить комментарий