Wie kann ich eine ArrayList in Kotlin filtern, damit ich nur Elemente habe, die meiner Bedingung entsprechen?


71

Ich habe ein Array:

var month: List<String> = arrayListOf("January", "February", "March")

Ich muss die Liste filtern, damit ich nur noch übrig habe "January".


Bitte klären Sie die Frage, dass "Januar" aus der Liste herausgefiltert (entfernt) werden soll, oder filtern Sie die Liste so, dass NUR "Januar" angezeigt wird ... Die Frage wird in den Antworten auf eine Weise interpretiert, die dem Sinn entgegengesetzt erscheint.
Jayson Minard

1
Für neue Kotlin-Entwickler ist es eine gute Idee, das STDLIB-API-Referenzhandbuch zu scannen, damit Sie eine Vorstellung davon haben, was zur Verwendung verfügbar ist. kotlinlang.org/api/latest/jvm/stdlib/index.html Und wenn Sie aus Java 8-Streams stammen, können Sie sich in stackoverflow.com/questions/34642254/…
Jayson Minard

Ich musste den Monat Januar herausfiltern. Ich habe die Frage bearbeitet
Nitt

filtern oder filtern?
Strg-Alt-Delor

Antworten:


114

Mit diesem Code können Sie den Januar mithilfe dieses Codes aus dem Array herausfiltern

var month: List<String> = arrayListOf("January", "February", "March")
// to get the result as list
var monthList: List<String> = month.filter { s -> s == "January" }

// to get a string
var selectedMonth: String = month.filter { s -> s == "January" }.single()

7
Beachten Sie, dass Sie in Kotlin nicht .equalsexplizit verwenden müssen. Es wäre idiomatischer, nur das zu verwenden, ==was das Richtige tut.
Zienkikk

3
Dies ist das Gegenteil der Anfrage. Sie möchten "Januar" aus der Liste entfernen und nicht nur den Januar behalten. Bitte aktualisieren Sie die Antwort, um korrekt zu sein. Andernfalls sollte die akzeptierte Antwort in die Antwort von zsmb13 verschoben werden, die beide Fälle abdeckt.
Jayson Minard

2
Sie können es noch weiter vereinfachen mit:month.single { s -> s == "January" }
Matthew Patience

Wie würde sich dies ändern, wenn Sie eine Liste mit benutzerdefinierten Objekten hätten und nicht nur einen integrierten Typ wie Int oder String?
Zonker.in.Geneva

37

Es gibt eine Reihe von Funktionen zum Filtern von Sammlungen. Wenn Sie nur übereinstimmende Werte beibehalten möchten "January", können Sie Folgendes verwenden filter():

val months = listOf("January", "February", "March")

months.filter { month -> month == "January" } // with explicit parameter name
months.filter { it == "January" }             // with implicit parameter name "it"

Diese geben Ihnen eine Liste, die nur enthält "January".

Wenn Sie alle Monate möchten, die nicht sind "January" , können Sie den Zustand entweder umkehren !=oder verwenden filterNot():

months.filter { it != "January" }
months.filterNot { it == "January" } 

Diese geben Ihnen eine Liste mit "February"und "March".

Beachten Sie, dass im Gegensatz zu Java die Verwendung der Operatoren ==und !=in Kotlin tatsächlich dem Aufruf der equalsFunktion für die Objekte entspricht. Weitere Informationen finden Sie in den Dokumenten zur Gleichstellung .

Die vollständige Liste der Erfassungsfunktionen in der Standardbibliothek finden Sie in der API-Referenz .


Wie würde ich mehrere Werte herausfiltern? Angenommen, ich möchte, dass sowohl "Januar" als auch "März" aus der Liste herausgefiltert werden.
Lidia Hocke

5
Sie könnten so etwas tun months.filter { it !in listOf("January", "March" }.
zsmb13

17

Sie möchten diese Liste von Zeichenfolgen filtern, die Monate enthalten.

var month : List<String> = arrayListOf("January", "February", "March")

Sie können die filterNot()Methode der Liste verwenden. Es wird eine Liste zurückgegeben, die alle Elemente außer dem angegebenen Prädikat enthält.

var filteredMonthList : List<String> = month.filterNot { s -> s == "January" }
// results:  ["February", "March"]

Sie können die filter()Methode der Liste verwenden. Es wird eine Liste zurückgegeben, die alle Elemente enthält, die dem angegebenen Prädikat entsprechen.

var filteredMonthList : List<String> = month.filter { s -> s == "January" }
// results:  ["January"]

Nach dem, filter()wenn wir verwenden single()Methode , dann wird es einen einzelnen Wert zurückgeben und eine Ausnahme auslösen , wenn mehr als ein Wert in der Liste ist.

var filteredMonth : String = month.filter { s -> s == "January" }.single()
// result:  "January"

Dies ist das Gegenteil von dem, was gefragt wurde.
Jayson Minard

Die Frage fragt nach dem Monat, was bedeutet, ihn zu entfernen. Sie tun das Gegenteil und filtern alles, ABER den Monat. Die Frage sollte etwas klarer formuliert werden als "Filter out the month"
Jayson Minard

@JaysonMinard Bitte überprüfen Sie die Antwort jetzt.
Avijit Karmakar

@ JaysonMinard Danke. Die Antwort sieht fantastisch aus.
Avijit Karmakar

9

Ich teile nur, dass Sie, wenn Sie eine benutzerdefinierte Liste haben und prüfen, ob diese null oder leer ist, Kotlin in einer einzigen Zeile einchecken können. Tun Sie es einfach so

  fun filterList(listCutom: List<Custom>?) {
    var fiterList = listCutom!!.filter { it.label != "" }
    //Here you can get the list which is not having any kind of lable blank
  }

Sie können auch mehrere Bedingungen überprüfen

 fun filterList(listCutom: List<Custom>?) {
    var fiterList = listCutom!!.filter { it.label != "" && it.value != ""}
    //Here you can get the list which is not having any kind of lable or value blank
  }

Hinweis: Ich gehe davon aus, dass label & value die Variablen der benutzerdefinierten Modellklasse sind.


7

Sie können auch find oder verwenden findLast. Dies ist speziell dazu gedacht, nur einen Wert anstelle einer Liste von Stringzurückgegebenen im Fall von zurückzugeben filter.

var month = arrayListOf("January", "February", "March")
var result = month.find { s -> s == "January" }

0

Filtern nach Prädikat

    val numbers = listOf("one", "two", "three", "four")
    var items: List<String> = numbers.filter { s -> s == "one" }

    var item = numbers.singleOrNull { it == "one" }

    if (item != null) {
        print("FOUND:$item")
    } else {
        print("Not FOUND!")
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.