AFAIK nie ma wydajnego sposobu w standardowych bibliotekach Java do parsowania liczby całkowitej z podłańcucha bez faktycznego tworzenia nowego łańcucha zawierającego podciąg.Wydajne parsowanie liczb całkowitych z podciągów w Javie
Jestem w sytuacji, w której parsuję miliony liczb całkowitych z ciągów i nie chcę specjalnie tworzyć nowych ciągów dla każdego podciągu. Kopiowanie to obciążenie, którego nie potrzebuję.
Podając łańcuch s, chciałbym metody takie jak:
parseInteger(s, startOffset, endOffset)
z semantyką jak:
Integer.parseInt(s.substring(startOffset, endOffset))
Teraz wiem, że mogę napisać to dość trywialnie tak:
public static int parse(String s, int start, int end) {
long result = 0;
boolean foundMinus = false;
while (start < end) {
char ch = s.charAt(start);
if (ch == ' ')
/* ok */;
else if (ch == '-') {
if (foundMinus)
throw new NumberFormatException();
foundMinus = true;
} else if (ch < '0' || ch > '9')
throw new NumberFormatException();
else
break;
++start;
}
if (start == end)
throw new NumberFormatException();
while (start < end) {
char ch = s.charAt(start);
if (ch < '0' || ch > '9')
break;
result = result * 10 + (int) ch - (int) '0';
++start;
}
while (start < end) {
char ch = s.charAt(start);
if (ch != ' ')
throw new NumberFormatException();
++start;
}
if (foundMinus)
result *= -1;
if (result < Integer.MIN_VALUE || result > Integer.MAX_VALUE)
throw new NumberFormatException();
return (int) result;
}
Ale nie o to chodzi. Wolałbym to zrobić ze sprawdzonej, obsługiwanej biblioteki firm trzecich. Na przykład parsowanie longów i radzenie sobie z Long.MIN_VALUE jest nieco subtelne, a ja oszukuję powyżej, analizując ints w longs. A powyższy problem nadal występuje, jeśli przeanalizowana liczba całkowita jest większa niż Long.MAX_VALUE.
Czy istnieje taka biblioteka?
Moje poszukiwania okazały się niewielkie.
Chciałbym kusić, aby rzucić całość w C i użyć standardowego wejścia i wyjścia. – Bathsheba