【问题标题】:What is the best way to fixed size of List in Kotlin在 Kotlin 中固定 List 大小的最佳方法是什么
【发布时间】:2019-05-03 19:59:35
【问题描述】:

我有一个 ParentObject 列表。 Foreach parentObject,它有 2 个 childObject。 像这样的画面

val listParent: MutableList<ParentObject> = mutableList() 

ParentObject {  
 ChildOjbect1{}   // object1 can not be NULL
 ChildOjbect2{}   // object2 can be NULL
}

而且,我想建立一个 ChildObject 的 mutableList。

val listChild: MutableList<ChildObject> = mutableList()  

list.add(parentObject.childOjbect1) // Because childObj1 can not be null  
parentOjbect.childObject2?.let { child ->  
  list.add(child)  
}

问题:
我只需要 6 个项目的 listChild(基本上我想将 listChild 的固定大小为 6)
我在 Kotlin 中编码如下:

fun buildListChild(): List<ChildOjbect> {
  val listChild // instance mutable listChild
  forEach( parent: listParent) {
    listChild.add(parent.childObject1)
    parent.childOjbect2?.let {  it ->
    listChild.add(it)
  }
  return listChild.take(6)
}

我认为性能不好,因为它在所有父项中循环。 除此之外,我真的不想在添加之前总是检查 listChild 的大小。
在这里解决问题的最佳方法是什么?

【问题讨论】:

  • 如果数组大小为 6 会怎样?
  • 我不明白你的意思???
  • 我的意思是 listchild 的最大大小是 6。它可以是 3,4 项取决于 listParent

标签: android list loops kotlin


【解决方案1】:

您可以创建具有固定大小的列表或数组,但在这种情况下,您需要将其初始化为val childList = arrayOfNulls&lt;ChildObject&gt;(6)(没有其他选项可以在不初始化的情况下拥有具有固定大小的数组),并在您的循环中检查它是否完整(或添加最后一个元素时)并从方法返回。

在这种情况下,您不需要遍历所有父元素并在剪切它之后,只需进行简单的检查。

【讨论】:

  • 这和我想的一样。我真的不想在添加之前总是检查列表的大小!!!
  • 我认为无论如何你都需要做一些检查以知道何时从方法返回,这样你就不会执行不必​​要的循环迭代。它可以做一些在列表已满(大小为 6)时抛出异常的外部库,但它们仍然会在内部进行相同的大小检查。如果您想要一些清晰的代码解决方案,请使用适当的方法创建您的自定义 List 类。
  • @kostua 嗯,也许我们必须在每次添加之前检查子列表的大小。它看起来像: if (listChild.size
【解决方案2】:

您可以使用简化的语法(更新,感谢@alexey-romanov):

fun buildListChild() = parent
    .flatMap{it -> listOf(parent.childObject1, parent.childOjbect2)}
    .filterNotNull()

listOf() 是(应该是)不可变的。

如果列表中存在的唯一引用是只读的 种类繁多,我们可以认为集合是完全不可变的。一个简单的方法 创建这样的集合是这样的:

val items = listOf(1, 2, 3)

目前,listOf 方法是 使用数组列表实现,但将来更节省内存 可以返回完全不可变的集合类型,利用 他们知道他们无法改变的事实。

【讨论】:

  • 而不是map(something).flatMap {it},只需使用flatMap(something)
  • @MahdiPerfect 正如你所说,我们仍然需要循环访问父列表的所有项目吗?这不是浪费时间吗?
  • .flatMap{it -> listOf(parent.childObject1, parent.childOjbect2)} // 注意,childObject2 可以为空。我们必须在这里检查???
【解决方案3】:

这是一个简单的完整解决方案。

fun buildListChild(parents: List<ParentObject>) = parents
    .flatMap { listOfNotNull(it.childObject1, it.childObject2) }
    .take(6)
    .toMutableList()

或者您甚至可以避免创建嵌套列表,如下所示。

fun buildListChild(parents: List<ParentObject>) = sequence {
    for (parent in parents) {
        yield(parent.childObject1)
        if (parent.childObject2 != null) {
            yield(parent.childObject2)
        }
    }
}.take(6).toMutableList()

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2012-08-09
    • 2011-01-07
    • 2021-09-15
    相关资源
    最近更新 更多