2717 Stimmen

Wie kann ich in Java feststellen, ob ein Array einen bestimmten Wert enthält?

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 ?

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.

21voto

Tom Hawtin - tackline Punkte 142461

ObStupidAnswer (aber ich denke, es gibt hier irgendwo eine Lektion):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}

2 Stimmen

Das Auslösen von Ausnahmen ist offensichtlich schwer, aber dies wäre eine neuartige Möglichkeit, einen Wert zu testen, wenn es funktioniert. Der Nachteil ist, dass die Aufzählung vorher definiert werden muss.

14voto

not Punkte 141

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:

  1. HashSet
  2. asList
  3. sortieren & binär

Bei einem sortierten Array:

  1. HashSet
  2. Binär
  3. asList

So oder so, HashSet gewinnt.

3 Stimmen

Die Zugehörigkeit zu einem HashSet sollte O(1) sein und die binäre Suche in einer sortierten Sammlung ist O(log n).

14voto

Zar E Ahmer Punkte 32557

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.

11voto

jhodges Punkte 2958

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");

10voto

Shineed Basheer Punkte 550

Unter Java 8 Streams verwenden.

List<String> myList =
        Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
        .filter(s -> s.startsWith("c"))
        .map(String::toUpperCase)
        .sorted()
        .forEach(System.out::println);

CodeJaeger.com

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.

Powered by:

X