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.

5voto

Glen Best Punkte 22041
  1. 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(...)
  2. 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);

4 Stimmen

Warum die Mühe mit TreeSet ? HashSet ist schneller (O(1)) und erfordert keine Ordnung.

4voto

SubbaRao Boddu Punkte 82

Prüfen Sie dies

String[] VALUES = new String[]{"AB", "BC", "CD", "AE"};
String s;

for (int i = 0; i < VALUES.length; i++) {
    if (VALUES[i].equals(s)) {
        // do your stuff
    } else {
        //do your stuff
    }
}

1 Stimmen

Das funktioniert nicht - es wird in den else für jede Element, das nicht übereinstimmt (wenn Sie also nach "AB" in diesem Array suchen, wird es dreimal dorthin gehen, da 3 der Werte nicht "AB" sind).

4voto

Mr.G Punkte 3223

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

3voto

TheArchon Punkte 303

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.
}

2voto

Avenger Punkte 195

Utilice Array.BinarySearch(array,obj) um das angegebene Objekt im Array zu finden oder nicht.

Ejemplo:

if (Array.BinarySearch(str, i) > -1)`  true --exists

false --nicht vorhanden

5 Stimmen

Array.BinarySearch et Array.FindIndex sind .NET-Methoden und existieren nicht in Java.

0 Stimmen

@ataylor es gibt Arrays.binarySearch in java. Aber du hast Recht, kein Arrays.findIndex

1 Stimmen

Es ist zu beachten: The array must be sorted prior to making this call. If it is not sorted, the results are undefined.

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