- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
int getPositionV1(String xml,int row,int col)
{
int p=0;
for (int lineNum=1;lineNum!=row;lineNum++)
{
p=xml.indexOf("\n\r",p)+eol.length();
if (p==0) throw new RuntimeException ("XML do not contain row "+row);
}
return p+col;
}
int getPositionV2(String xml, int row, int col)
{
int p0=0; int p1=xml.indexOf("\n",p0); int p2=xml.indexOf("\r",p0);
int p3=(p1!=-1 && p2!=-1)?xml.indexOf("\r\n",p0):-1;
for (int lineNum=1;lineNum!=row;lineNum++){
if (p1!=-1 && p1<p0) p1=xml.indexOf("\n",p0); if (p2!=-1 && p2<p0) p2=xml.indexOf("\r",p0);
if (p3!=-1 && p3<p0) p3=xml.indexOf("\r\n",p0);
String eol=""; if (p1!=-1 && p2!=-1 && p3!=-1){
if (p1<p2 && p1<p3) {eol="\n"; p0=p1;
}else if (p2<p1 && p2<p3) {eol="\r"; p0=p2;
}else if (p3<=p1 && p3<=p2) {eol="\r\n"; p0=p3;}
}else if (p1!=-1 && p2!=-1){
if (p1<p2) { eol="\n"; p0=p1;} else if (p2<p1) {eol="\r"; p0=p2;}
}else if (p1!=-1 && p3!=-1){
if (p1<p3) { eol="\n"; p0=p1;} else if (p3<=p1) {eol="\r\n"; p0=p3;}
}else if (p2!=-1 && p3!=-1){
if (p2 < p3) {eol="\r"; p0=p2;} else if (p3<=p2) {eol="\r\n"; p0=p3;}
}else if (p1!=-1){eol="\n"; p0=p1;} else if (p2!=-1) {eol="\r"; p0=p2;
}else if (p3!=-1){eol="\r\n"; p0=p3;}
p0+=eol.length(); if (p0<=0) throw new RuntimeException("XML do not contain row "+row);
}
return p0+col-1;
}
Задача: дана строка (String), номер линии (строки) и столбца, где расположен символ; найти позицию этого символа в исходной строке.
Первое решение: getPositionV1
Но конец строки может быть любой, например \n,\r,\n\r, а ещё несколько подряд идущих строк.
Задача: исправить, чтобы работало со всеми видами и сочетаниями переносов строк, и работало быстро.
Второе решение: getPositionV2
А достаточно было использовать регулярное выражение: Pattern.compile("\\R").matcher(xml)
Комментарии (0) RSS
Добавить комментарий