Metody typu string

Metody typu string
UR
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:9
0

Napisałem dwie metody. Jedna z nich miała sprawdzić czy dany łańcuch jest liczbą zmiennoprzecinkową w systemie dziesiętnym, a druga czy liczba jest całkowita w systemie szesnastkowym. Metody działają, ale mogłyby lepiej. Może ktoś miałby jakieś wskazówki?

public static boolean isNumber(String index) {
    return index.matches("[-]?[.]?[0-9]{0,8}([.]|[eE][+-])?[0-9]{0,8}?[fFdD]?");

}

public static boolean isHexInteger(String index) {
return index.matches("[-]?[0][xX][0-9a-fA-F]{0,8}[Ll]?");
}

DA
Twój regex przy każdym subpaternie dopuszcza 0 wystąpień, więc będzie pasował do pustego tekstu. Masz też dwie opcjonalne kropki, przyjmiesz więc liczbę -.1.3. Co ciekawe nie przyjmiesz 9.9e9. Użyłbym raczej [+-]?([0-9]+\.?|[0-9]*\.[0-9]+)([eE][+-]?[0-9]+)?[fFdD]?
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0

Lepiej tzn ? Wg jakiego kryterium?
Ja bym zrobił w banalnej pętli na typach prostych, zero nowych obiektów i GC mówi dziękuję. Na wygrzanej JVM szybkość niemal kodu maszynowego

EDIT: oprócz tego lepiej formalnie, czyli trzymanie konwencji nazewniczej. Dlaczego 'index'? To nie jest żaden index do niczego.
A nazwy funkcji niedoskonale oddają cel.
Sam post ma zły tytuł 'metoda typu string' to w powszechnym rozumieniu 'metoda zwracająca string'


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
UR
musi być użyta metoda matches
KR
  • Rejestracja:ponad 8 lat
  • Ostatnio:7 dni
  • Postów:166
0
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 12 godzin
1

Możesz zapisać w statycznej stałej wynik Pattern.compile by nie liczyć go wielokrotnie. Tak czy siak musi być policzony (jest liczony w środku String.matches za każdym razem), więc liczenie go raz zmniejszy narzut przy sprawdzaniu wielu Stringów tym samym regexem.

Kod może wyglądać mniej więcej tak (nazewnictwo takie sobie):

Kopiuj
class NumberFormats {
  private static final HEX_PATTERN = Pattern.compile("jakiś regex");

  static boolean isHexNumber(String numberStr) {
    return HEX_PATTERN.matcher(numberStr).matches();
  }
}

Lepiej tzn ? Wg jakiego kryterium?
Ja bym zrobił w banalnej pętli na typach prostych, zero nowych obiektów i GC mówi dziękuję. Na wygrzanej JVM szybkość niemal kodu maszynowego

Jak ktoś lubi przygody to może też użyć TRegex z GraalVMa, który JITuje regexy do kodu maszynowego: https://github.com/oracle/graal/tree/master/regex


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
UR
Dzięki wielkie za pomoc

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.