Translate

воскресенье, 24 июня 2012 г.

String в Java. Методы charAt, indexOf, substring, length. Пишем класс для обработки строковых данных


 Сегодня мы рассмотрим класс 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);
}
  

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...