Sie können die Methode intersect verwenden, die iterable als Parameter verwendet und zurückgibt Set, das nur Elemente enthält, die sowohl in Ihrer Sammlung als auch in iterierbar sind. Dann müssen Sie nur noch die Größenprüfung durchführen.
Hier ist ein Beispiel:
%Vor% Dies ist die kürzeste und idiomatischste Art, wie ich any
und in
:
Natürlich können Sie auch eine Funktionsreferenz für den Operator in verwenden:
%Vor% Ich verwende setOf
für die erste Sammlung, da die Reihenfolge keine Rolle spielt.
Bearbeiten: Ich habe values
und array
wegen alex.dorokhows Antwort umgestellt . Die Reihenfolge spielt keine Rolle, damit der Check funktioniert, aber für die Leistung.
Das OP wollte die idiomatische Lösung. Wenn Sie nach einem effizienteren Weg suchen, gehen Sie zu adas Antwort .
Kombinieren von @aga und @ willi-mentzel Lösungen für eine bessere Effizienz und dynamische Menge von überprüften Werten:
%Vor%In diesem Fall wird das Array nur einmal (höchstens im schlimmsten Fall) vollständig iteriert.
Dies ist effizienter als (vorgeschlagen von @WilliMentzel):
%Vor%Wo das Array im schlimmsten Fall mal set.count mal durchlaufen wird.
Beachten Sie, dass Set.contains O (1) -Komplexität hat, aber IntArray :: contains hat O (N).
Natürlich macht diese Optimierung nur Sinn, wenn das Set oder Array groß genug ist.
Wenn es egal ist, ob beide im Array vorkommen, können Sie den Ausdruck when
wie folgt verwenden:
Dies wird "in Liste" drucken, wenn 2 oder 3 in der Liste sind.
Weitere Informationen zur Flusssteuerung finden Sie hier