【问题标题】:Optimize sorting methods优化排序方式
【发布时间】:2019-11-26 16:52:29
【问题描述】:

我有两种排序方法。 按优先级和截止日期排序。

fun getTargetsByPriority() {
    val valueEventListener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            targetList.clear()
            dataSnapshot.children
                .mapNotNull { it.getValue(Goal::class.java) }
                .sortedBy { it.priority }
                .toCollection(targetList)
            contract.updateViewContent()
        }

        override fun onCancelled(databaseError: DatabaseError) {
            Log.d("some", "Error trying to get targets for ${databaseError.message}")
        }
    }
    targetsRef?.addListenerForSingleValueEvent(valueEventListener)
}

fun getTargetsByDeadline() {
    val valueEventListener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            targetList.clear()
            dataSnapshot.children
                .mapNotNull { it.getValue(Goal::class.java) }
                .sortedBy { it.deadline }
                .toCollection(targetList)
            contract.updateViewContent()
        }

        override fun onCancelled(databaseError: DatabaseError) {
            Log.d("some", "Error trying to get targets for ${databaseError.message}")
        }
    }
    targetsRef?.addListenerForSingleValueEvent(valueEventListener)
}

但它们彼此非常相似。如何优化这段代码?

【问题讨论】:

    标签: android sorting kotlin optimization collections


    【解决方案1】:

    你可以这样做:

    inline fun <reified T : Any, R : Comparable<R>> DataSnapshot.sortChildrenTo(
      targetList: MutableList<T>, 
      crossinline sortCriteria: (T) -> R?
    ) {
      children.mapNotNull { it.getValue(T::class.java) }
        .sortedBy(sortCriteria)
        .toCollection(targetList)
    }
    

    然后让你写:

    targetList.clear()
    dataSnapshot.sortChildrenTo(targetList, Goal::priority)
    

    【讨论】:

    • 但是为什么你不使用内部类?
    【解决方案2】:

    您可以使用 sortedWith 并将比较器作为参数传递,而不是使用 sortedBy。 因此将您的两个函数合并为一个函数并将比较器作为参数。例如下面的函数需要一个字符串比较器。

    fun getTargets(comparator: Comparator<String>) {
    }
    

    现在你可以像下面这样调用这个函数了

    getTargets(Comparator{ o1, o2 -> o1.compareTo(o2)})
    

    现在在您的 sortedWith 函数调用中使用此比较器,您可以在其中对列表进行排序。

    你的电话看起来像下面这样。

    getTargets(Comparator{ o1, o2 -> o1.priority.compareTo(o2.priority)}) // For priority based sorting
    getTargets(Comparator{ o1, o2 -> o1.deadline.compareTo(o2.deadline)}) // For deadline based sorting
    

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 2016-06-09
      • 2013-04-18
      • 2012-09-17
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多