In Kotlin enthält die Überprüfung den einen oder anderen Wert?

7

In Kotlin können wir tun:

%Vor%

Aber wenn ich überprüfen möchte, ob 2 oder 3 in arr sind, was ist der idiomatische Weg, dies zu tun, außer:

%Vor%     
ADev 04.01.2018, 13:17
quelle

6 Antworten

7

Ich würde any () Erweiterungsmethode verwenden:

%Vor%

Auf diese Weise durchlaufen Sie das Array nur einmal und Sie erstellen keine Set-Instanz, nur um zu überprüfen, ob sie leer ist oder nicht (wie in einer anderen Antwort auf diese Frage).

    
aga 04.01.2018, 16:27
quelle
6

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%     
Mateusz 04.01.2018 13:28
quelle
4

Dies ist die kürzeste und idiomatischste Art, wie ich any und in :

%Vor%

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 .

    
Willi Mentzel 04.01.2018 16:37
quelle
3

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.

    
alex.dorokhov 05.01.2018 00:38
quelle
2

Ich denke, es ist am besten lesbar, die Anweisung umgekehrt zu schreiben:

%Vor%

Es ist sogar möglich, Bereiche in bestimmten Szenarien zu verwenden:

%Vor%

Am Ende sieht Ihre Lösung schon gut aus. Obwohl keine ausgefallene Bibliotheksfunktionalität verwendet wird.

    
s1m0nw1 04.01.2018 16:51
quelle
-2

Wenn es egal ist, ob beide im Array vorkommen, können Sie den Ausdruck when wie folgt verwenden:

%Vor%

Dies wird "in Liste" drucken, wenn 2 oder 3 in der Liste sind.

Weitere Informationen zur Flusssteuerung finden Sie hier

    
Biskit1943 04.01.2018 13:27
quelle

Tags und Links