Ich habe eine String[]
mit Werten wie diesen:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
Gegeben String s
Gibt es eine gute Methode, um zu testen, ob VALUES
enthält s
?
Ich habe eine String[]
mit Werten wie diesen:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
Gegeben String s
Gibt es eine gute Methode, um zu testen, ob VALUES
enthält s
?
Wenn Sie HashSet<String> verwenden, wie Tom Hawtin vorgeschlagen hat, brauchen Sie sich nicht um die Sortierung zu kümmern, und die Geschwindigkeit ist die gleiche wie bei der binären Suche in einem vorsortierten Array, wahrscheinlich sogar schneller.
Es hängt natürlich alles davon ab, wie Ihr Code aufgebaut ist, aber aus meiner Sicht wäre die Reihenfolge wie folgt:
Auf einer unsortiert Array:
Bei einem sortierten Array:
So oder so, HashSet gewinnt.
Entwickler tun das oft:
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);
Der obige Code funktioniert, aber es ist nicht notwendig, eine Liste zuerst in eine Menge zu konvertieren. Die Umwandlung einer Liste in eine Menge erfordert zusätzliche Zeit. Es kann so einfach sein wie:
Arrays.asList(arr).contains(targetValue);
o
for (String s : arr) {
if (s.equals(targetValue))
return true;
}
return false;
Der erste ist besser lesbar als der zweite.
Wenn Sie die Google-Sammlungen Bibliothek haben, kann Tom's Antwort sehr vereinfacht werden, indem Sie ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)
Dadurch wird die vorgeschlagene Initialisierung deutlich vereinfacht.
private static final Set<String> VALUES = ImmutableSet.of("AB","BC","CD","AE");
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
6 Stimmen
Das ist ein langer Weg, aber Sie können eine for-Schleife verwenden: "for (String s : VALUES) if (s.equals("MYVALUE")) return true;
1 Stimmen
Ja, es war mir fast peinlich, die Frage zu stellen, aber gleichzeitig war ich überrascht, dass sie noch nicht gestellt worden war. Es ist eine dieser APIs, mit denen ich einfach noch nicht in Berührung gekommen bin...
3 Stimmen
@camickr - ich habe eine fast identische Situation mit diesem hier: stackoverflow.com/a/223929/12943 Es wird immer wieder abgestimmt, obwohl es nur ein Copy/Paste aus der Sun-Dokumentation war. Ich schätze, die Bewertung basiert darauf, wie viel Hilfe man geleistet hat und nicht darauf, wie viel Mühe man sich gegeben hat - und vor allem darauf, wie schnell man es veröffentlicht hat! Vielleicht sind wir auf das Geheimnis von John Skeet gestoßen! Nun, gute Antwort, +1 für Sie.
3 Stimmen
Wenn Sie Apache Commons verwenden, dann org.apache.commons.lang.ArrayUtils.contains() tut dies für Sie.
0 Stimmen
@Zach: Sie tappen in die Falle des for-if-Antipatterns, tun Sie das nicht.
50 Stimmen
@camickr weil Leute, wie ich, eine Frage googeln, auf das SO-Ergebnis klicken, Ihre Antwort sehen, sie testen, es funktioniert, die Antwort hoch bewerten und dann gehen.
2 Stimmen
Ich vermisse wirklich eine einfache
indexOf
etcontains
injava.util.Arrays
- die beide unkomplizierte Schleifen enthalten würden. Ja, Sie können diese in 1 Minute schreiben; aber ich ging trotzdem zu StackOverflow in der Erwartung, sie irgendwo im JDK zu finden.