2013-03-31 11 views
8

Ich möchte prüfen, ob ein item in einem item set existiert.Java-Äquivalent von Python 'in' - für Set-Mitgliedschaft Test?

Ich möchte diese in Java tun:

def is_item_in_set(item, item_set): 
    if item in item_set: 
     return true 
    else: 
     return false 

(.. Entschuldigt, wenn meine Python ist nicht Pythonic Nur meine Absicht vermitteln wollte)

Ich habe es geschafft, schreibe :

boolean isItemInSet(String item, String[] itemSet) { 
    for(int i =0; i < itemSet.length; ++i) { 
     if(item.equals(itemSet[i])) { 
      return true; 
     } 
    } 
    return false; 
} 

gibt es eine bessere Art und Weise zum Testen Set-Mitgliedschaft in Java?

+0

Diese beiden Teile des Codes sind nicht gleichwertig. – Cairnarvon

+0

Sind sie jetzt? Hast du dich auf die '.contains()' bezogen? Ich habe es durch '.equals()' ersetzt. –

+4

Es gibt ein Anti-Muster in Ihrem Python, warum nicht einfach 'return item in item_set'? Sie sind auch nicht dasselbe wie das letztere Beispiel nicht so effizient ist, es ist O (n), während das Python-Beispiel O (1) ist. –

Antwort

12

Sie können es nicht mit einem geraden Array, aber Sie können mit einem Set<T> durch den Aufruf .contains. Wenn Sie das Gefühl haben, dass Sie viele isItemInSet Anrufe tätigen werden, sollten Sie anstelle von Arrays die Verwendung von Set s in Betracht ziehen - Sie werden viel glücklicher sein.

Wenn Sie beispielsweise HashSet<T> verwenden, wird isItemInSet ein O (1) -Operation (im Durchschnitt). Das Einfügen und Löschen ist ebenfalls ähnlich schnell. In der Tat ist ein HashSet<T> in Java im Wesentlichen das gleiche wie ein Python set() (ähnliche zugrundeliegende Konzept und Leistungsmerkmale) - Sie sehen eine große Verbesserung der Geschwindigkeit mit vielen Aufrufen zu Abfrage, Einfügen oder Löschen auf dem Set.

+0

Wird ausgecheckt 'Set '! –

+4

Beachten Sie, dass 'Set ' eine Schnittstelle ist. Sie sollten eine implementierende Unterklasse wie 'HashSet ' verwenden (empfohlen für die meisten Anwendungen). – nneonneo

+0

:) Sollen akzeptieren, sobald ich meine 'HashSet ' up-and-running! –

Verwandte Themen