Bestimmen Sie den Datentyp der Benutzereingabe dynamisch in JAVA

8

Ich habe den folgenden Code geschrieben, um den Dateityp der Eingabe zu bestimmen, die vom Benutzer eingegeben wurde.

Update : Das Parsen in Float wurde entfernt, da ein Double -Wert auch in Float bei Kosten einer gewissen Genauigkeit analysiert werden kann, wie von @DodgyCodeException

erwähnt %Vor%

Ich muss das hunderte Male wiederholen und ich habe gelesen, dass Exception eine teure Operation ist.
Gibt es einen besseren Weg, dies zu erreichen?

    
Kainix 08.02.2018, 10:23
quelle

4 Antworten

7

Mein Ansatz wäre, das Framework seine Sache machen zu lassen und es zu benutzen, um die Eingabe generisch zu analysieren:

%Vor%

Vielleicht verwenden Sie eine switch -Anweisung oder eine Map anstelle einer langen Liste von if -Konstrukten. Und fangen Sie JSONException für Eingabe, die nicht gültig JSON ist.

Könnte vielleicht vereinfacht werden, um obj.getClass() oder obj.getClass().getSimpleName() für fast identische Funktionalität zu dem zurückzugeben, was Sie jetzt haben.

    
Henrik 08.02.2018, 11:01
quelle
5

Ehrlich gesagt mag ich die Idee nicht, den Typ durch Parser-Ausnahmen zu bestimmen. Ich würde für jedes Format ein Muster erstellen und über alle von ihnen iterieren, um zu überprüfen, ob die angegebene Zeichenfolge mit einer von ihnen übereinstimmt.

Es ist ähnlich, wie die Klasse Scanner funktioniert, aber es ist ziemlich kompliziert. Es ist schwierig, die regulären Ausdrücke zu schreiben, die alle möglichen Fälle abdecken sollten.

Aber wenn die Regexes vorbereitet sind, ist der Algorithmus einfach:

%Vor%

Hier ist ein interessanter Teil - ein Beispiel für integerPattern() . Ich habe es von Scanner genommen und es ein wenig vereinfacht:

%Vor%

Ich bin mir ziemlich sicher, dass du alle Regexes googeln oder sie hier finden kannst.

Aber was ist, wenn es eine "leichtere" Lösung gibt oder Sie einfach keinen Regex-Ansatz verwenden wollen?

Sie können verschiedene Techniken mischen, indem Sie Map<String, Predicate<String>> :

eingeben %Vor%

Ich glaube, es ist besser lesbar, es verringert die Verschachtelungstiefe und kapselt verschiedene Logik in separaten Methoden.

    
Andrew 08.02.2018 10:55
quelle
0

Das lange und kurze ist es:

  • Es gibt keine vernünftige Möglichkeit, diese exakte Funktionalität einzukapseln, ohne diese Ausnahmen zu erfassen.
  • Wenn Sie davon sprechen, dass diese Methode "hunderte" Male ausgeführt wird, sollte dies kein Leistungsengpass sein. Wenn dies der Fall ist, dann benchmarken Sie es, ermitteln Sie, wo die Engpässe bei dieser Methode liegen, und richten Sie diese dann gezielt an.

Für die Fertigstellung gibt es jedoch ähnliche Dinge, die Sie erreichen können, ohne diese Ausnahmen zu erfassen - bitte beachten Sie, dass ich keine Benchmarks gemacht habe und diese Ergebnisse möglicherweise schneller sind oder nicht dein Fall!

Um herauszufinden, ob etwas JSON ist, Es gibt eine mayBeJSON() -Methode in JSON-lib , aber es ist eine ziemlich veraltete Bibliothek (letzte Aktualisierung 2010).

Wenn Sie wissen wollen, ob etwas speziell in einen int passt, dann gibt es keinen anderen vernünftigen Weg als den NFE off parseInt() wirklich zu fangen. Wenn Sie jedoch nur wissen möchten, ob etwas eine Zahl ist, können Sie einfach eine Regex verwenden:

%Vor%

(Andere Regexe werden online für Dezimalzahlen, Zahlen mit Exponenten usw. einfach berechnet / gefunden.)

Oder Sie könnten es streamen und jedes Zeichen einzeln überprüfen:

%Vor%

Alternativ können Sie Ihre Ausnahmeregelungen mit NumberUtils.isCreateable () von Apache Commons ( isParseable() , und andere Methoden in dieser Klasse können ebenfalls nützlich sein.)

    
berry120 08.02.2018 11:02
quelle
0
  

Ich möchte wissen, ob die Eingabe ein json / jsonarray ist oder nicht.

Sie müssen mit JSONException umgehen, um den JSON-Typ zu bestimmen, und dann können Sie NumberFormat parse () Methode, um die anderen Typen zu bestimmen, wie unten gezeigt:

%Vor%     
developer 08.02.2018 10:53
quelle

Tags und Links