Metody typu string

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]?");
}

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'

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):

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1