Ich bin versucht, eine zu erstellen final class CaseInsensitiveString implements CharSequence
.
Dies würde es uns ermöglichen, Variablen und Felder dieses Typs zu definieren, anstatt eine reguläre zu verwenden String
. Wir können auch zB a Map<CaseInsensitiveString, ?>
, a Set<CaseInsensitiveString>
usw. haben.
Was sind einige der Vor- und Nachteile dieses Ansatzes?
java
strings
case-insensitivity
Polygenschmierstoffe
quelle
quelle
Antworten:
Groß- und Kleinschreibung ist eine Eigenschaft des Vergleichs, nicht des Objekts (*). Sie möchten dieselbe Zeichenfolge unabhängig vom Fall vergleichen oder nicht, je nach Kontext.
(Und Sie haben eine ganze Art von Würmern, da ein Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung von der Sprache abhängt - ich bin in türkischer Sprache als İ in Großbuchstaben geschrieben - und sogar der Kontext - abhängig vom Wort und dem Dialekt ß kann in Großbuchstaben geschrieben werden SS oder SZ auf Deutsch.)
(*) Es kann eine Eigenschaft des Objekts sein, das die Zeichenfolge enthält, aber das ist etwas anders als eine Eigenschaft der Zeichenfolge selbst. Und Sie können eine Klasse haben, die außer einer Zeichenfolge keinen Status hat. Wenn Sie zwei Instanzen dieser Klasse vergleichen, wird ein Vergleich der Zeichenfolge ohne Berücksichtigung der Groß- und Kleinschreibung verwendet. Diese Klasse ist jedoch keine Allzweckzeichenfolge, da sie keine Methoden bereitstellt, die für Allzweckzeichenfolgen erwartet werden, und Methoden bereitstellt, die dies nicht sind. Diese Klasse heißt nicht CaseInsensitiveString, sondern PascalIdentifier oder was auch immer zur Beschreibung relevant ist. Übrigens wird der fallunabhängige Vergleichsalgorithmus höchstwahrscheinlich durch seinen Zweck bereitgestellt und ist vom Gebietsschema unabhängig.
quelle
TreeSet<String>
VerwendungString.CASE_INSENSITIVE_ORDER
über a empfehlenHashSet<CaseInsensitiveString>
? Beachten Sie, dass mitTreeSet
MittelnO(log n)
fürcontains
. Darüber hinaus ist dieser Komparator unvereinbar mitequals
, was bedeutet , dass die resultierendeTreeSet
nicht den allgemeinen gehorchtSet
Vertrag (dh kann escontains(x)
, auch wenn es kein Element hat , das istequals
zux
).equals()
Implementierung für jedes Objekt. Es gibt eine Standardimplementierung, die jedes Objekt überschreiben kann. Ich glaube nicht, dass Sie den Hash definieren können, aber ich habe es nie versucht - die Tabellen haben immer gut funktioniert, ohne sich darüber Gedanken zu machen (ein Grund, warum ich Java über C ++ mag :)).Ganz oben auf meinem Kopf:
Vorteile:
bool UserIsRegistered(CaseInsensitiveString Username)
Nachteile:
CaseInsensitiveString
einen Benutzernamen speichern, wird im Front-End-Code der Name des Benutzers als "Bob Smith" oder "BOB SMITH" angezeigt, obwohl es sinnvoll ist, Back-End-Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen.quelle
CaseInsensitiveString ist keine schlechte Idee, hängt von Ihrer Verwendung ab, solange Sie nicht erwarten, dass es mit String zusammenarbeitet.
Sie können einen CaseInsensitiveString in einen String konvertieren oder umgekehrt, und das ist alles, was Sie tun sollten.
Das Problem tritt auf, wenn Sie versuchen, so etwas zu tun
Sie sind zum Scheitern verurteilt, wenn Sie Ihr CaseInsensitiveString-Unternehmen mit einem normalen String erstellen möchten, da Sie die Symmetrie und Transitivität für equals () (und andere Verträge) verletzen.
Bitte fragen Sie sich jedoch, in welchem Fall Sie diesen CaseInsensitiveString wirklich benötigen, für den String.CASE_INSENSITIVE_ORDER nicht geeignet ist. Ich wette nicht viele Fälle. Ich bin mir sicher, dass es einen Fall geben wird, der es wert ist, diese spezielle Klasse zu haben, aber fragen Sie sich zuerst.
quelle
Das explizite Erstellen von Typen in Ihrer Domäne / Ihrem Modell ist eine sehr gute Vorgehensweise. Wie Maxpm sagte, ist es selbstdokumentierend. Auch ein großes Plus: Menschen können (aus Versehen) keine falschen Eingaben verwenden. Das einzig Negative wäre, dass es Junior- (und sogar einige Medior-) Programmierer abschreckt.
quelle
Eine CaseInsensitiveString-Klasse und ihre Helfer fügen viel Code hinzu und machen alles weniger lesbar als die String.toLoweCase () -Methode.
ist komplexer, weniger selbstdokumentierend und weniger flexibel als
quelle
Die am häufigsten verwendeten Implementierungen im Web unterscheiden zwischen Groß- und Kleinschreibung - XML, JavaScript. In Bezug auf die Leistung ist es immer am besten, für jeden Fall die am besten geeignete Funktion / Eigenschaft / das am besten geeignete Objekt zu verwenden.
Wenn Sie mit Strukturen arbeiten - XML oder JS oder ähnlichem - ist die Groß- und Kleinschreibung wichtig. Mit Systembibliotheken geht es viel schneller.
Wenn Sie mit Daten in einer Datenbank arbeiten, wie oben erwähnt, wird die Datenbankindizierung für Zeichenfolgen verwendet, bei denen zwischen Groß- und Kleinschreibung unterschieden wird.
Wenn Sie Daten im laufenden Betrieb verarbeiten, ist es wichtig, die erforderlichen Umrechnungskosten für jede Zeichenfolge zu berechnen. Es ist wahrscheinlich, dass die Zeichenfolgen irgendwie verglichen oder sortiert werden sollten.
quelle