【问题标题】:How can I filter an ArrayList in Kotlin so I only have elements which match my condition?如何在 Kotlin 中过滤 ArrayList,以便我只有符合我的条件的元素?
【发布时间】:2017-10-21 06:37:04
【问题描述】:

我有一个数组:

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

我必须过滤列表,所以我只剩下"January"

【问题讨论】:

  • 请澄清您希望“一月”从列表中过滤出来(已删除)的问题,或将列表过滤为只有“一月”......这个问题正在以某种方式在答案中解释这似乎与有意义的相反。
  • 对于新的 Kotlin 开发人员来说,浏览 STDLIB API 参考指南是一个好主意,这样您就可以了解可以使用的内容。 kotlinlang.org/api/latest/jvm/stdlib/index.html 如果来自 Java 8 流,您可以在 stackoverflow.com/questions/34642254/… 中了解等价物
  • 我需要过滤掉一月份。我已经编辑了问题
  • 过滤还是过滤?

标签: list kotlin filtering


【解决方案1】:

您可以使用此代码从数组中过滤出一月,通过使用此代码

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()

【讨论】:

  • 请注意,在 Kotlin 中,您不必显式使用 .equals。只使用 == 会更习惯,这会做正确的事情。
  • 这与请求相反,他们想从列表中删除“一月”而不是只保留一月,请更新答案以使其正确,否则应将接受的答案移至 zsmb13 中的答案涵盖这两种情况。
  • 你可以进一步简化它:month.single { s -&gt; s == "January" }
  • 如果你有一个自定义对象列表,而不是像 Int 或 String 这样的内置类型,这将如何改变?
  • 更短的month.single { it == "January" }
【解决方案2】:

您想过滤这个包含月份的字符串列表。

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

您可以使用filterNot() 列表方法。它返回一个包含除给定谓词之外的所有元素的列表。

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

您可以使用filter() 列表方法。它返回一个列表,其中包含与给定谓词匹配的所有元素。

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

filter() 之后如果我们使用single() 方法,那么它将返回一个值,如果列表中有多个值则抛出异常。

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

【讨论】:

  • 这与所要求的相反。
  • 问题要求过滤月份,意思是去掉。您做相反的事情并过滤除月份之外的所有内容。这个问题应该更清楚地表述为“过滤掉月份”
  • @JaysonMinard 请立即查看答案。
  • @JaysonMinard 谢谢。答案看起来很棒。
【解决方案3】:

有很多过滤集合的功能,如果你只想保留匹配"January"的值,你可以使用简单的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"

这些将为您提供一个仅包含 "January" 的列表。

如果您希望所有月份都"January",您可以使用!= 反转条件,或使用filterNot()

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

这些将为您提供一个包含"February""March" 的列表。

请注意,与 Java 不同,在 Kotlin 中使用 ==!= 运算符实际上与在对象上调用 equals 函数相同。有关更多信息,请参阅有关 equality 的文档。

有关标准库中集合函数的完整列表,请参阅API reference

【讨论】:

  • 如何过滤掉多个值?比如说,我想将“一月”和“三月”都从列表中过滤掉?
  • 你可以做类似months.filter { it !in listOf("January", "March" }的事情。
【解决方案4】:

我只是分享一下,如果您有 自定义列表 并检查它是 null 还是空白,您可以在 Kotlin 中单行检查 就这样吧

  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
  }

您也可以检查多个条件

 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
  }

注意:我假设 label & valueCustom Model 类的变量。

【讨论】:

  • 什么是标签是布尔值,我们仍然想检查该标签是否存在于列表中?不想使用默认情况。
【解决方案5】:

您也可以使用findfindLast。这特别意味着只返回一个值,而不是在 filter 的情况下返回的 String 列表。

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

【讨论】:

    【解决方案6】:

    按谓词过滤

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

    【讨论】:

      猜你喜欢
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2012-11-23
      • 2021-01-19
      • 1970-01-01
      • 2023-01-31
      • 2020-10-31
      相关资源
      最近更新 更多