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
?
Für Arrays mit begrenzter Länge ist Folgendes zu verwenden (wie von camickr ). Dies ist bei wiederholten Prüfungen langsam, insbesondere bei längeren Arrays (lineare Suche).
Arrays.asList(...).contains(...)
Für schnelle Leistung, wenn Sie wiederholt gegen eine größere Menge von Elementen prüfen
Ein Array ist die falsche Struktur. Verwenden Sie eine TreeSet
und fügen Sie jedes Element hinzu. Es sortiert Elemente und hat eine schnelle exist()
Methode (binäre Suche).
Wenn die Elemente die Comparable
& Sie wollen die TreeSet
entsprechend sortiert:
ElementClass.compareTo()
Methode muss kompatibel sein mit ElementClass.equals()
: siehe Triaden, die nicht zum Kampf antreten? (Java Set, dem ein Gegenstand fehlt)
TreeSet myElements = new TreeSet();
// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);
// *Alternatively*, if an array is forceably provided from other code:
myElements.addAll(Arrays.asList(myArray));
Andernfalls verwenden Sie Ihr eigenes Comparator
:
class MyComparator implements Comparator<ElementClass> {
int compareTo(ElementClass element1; ElementClass element2) {
// Your comparison of elements
// Should be consistent with object equality
}
boolean equals(Object otherComparator) {
// Your equality of comparators
}
}
// construct TreeSet with the comparator
TreeSet myElements = new TreeSet(new MyComparator());
// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);
Die Auszahlung: Überprüfung der Existenz eines Elements:
// Fast binary search through sorted elements (performance ~ log(size)):
boolean containsElement = myElements.exists(someElement);
Versuchen Sie dies:
ArrayList<Integer> arrlist = new ArrayList<Integer>(8);
// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);
boolean retval = arrlist.contains(10);
if (retval == true) {
System.out.println("10 is contained in the list");
}
else {
System.out.println("10 is not contained in the list");
}
Arrays.asList() -> dann wird der Aufruf der Methode contains() immer funktionieren, aber ein Suchalgorithmus ist viel besser, da Sie nicht brauchen, um eine leichte Liste Wrapper um das Array zu erstellen, was ist, was Arrays.asList() tut.
public boolean findString(String[] strings, String desired){
for (String str : strings){
if (desired.equals(str)) {
return true;
}
}
return false; //if we get here… there is no desired String, return false.
}
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.