【问题标题】:Sorting Objects Alphanumerically按字母数字排序对象
【发布时间】:2016-09-12 15:01:52
【问题描述】:

我在尝试为我的应用程序排序“路线”列表时遇到问题,无论我尝试什么,我都无法获得我正在寻找的排序。

我希望它按 1、2、3、4、5 等排序,但是当我排序时,我得到 1、11、12、2、20 等等。

我的路线模型是

public open class Route(docValue:Map<String,Any>) {
    val route_id = (docValue["route_id"] as Number).toInt()
    val short_name = docValue["route_short_name"] as String
    val color = readColorMoreSafely(docValue, "route_color", Color.BLUE)
    val long_name = docValue["route_long_name"] as String 
}

用来排序的代码是

if(cityId != null && view != null) {
        val routesList = view.findViewById(R.id.routesList) as ListView
        val cache = TransitCache.getInstance(applicationContext, cityId, true)
        val routes = cache.getRoutes()
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext {
                val noRoutesMessage = view.findViewById(R.id.list_routes_no_routes_visible) as TextView
                noRoutesMessage.visibility = if(it.size == 0) View.VISIBLE else View.GONE
            }
        routes.toSortedList()
        listAdapter = RxListAdapter(applicationContext, R.layout.activity_list_routes_row, routes)
        routesList.adapter = listAdapter

但还是什么都没有,我只想按“route_id”对路线进行排序,我尝试了一些不同的东西,最后一个是

routes.toSortedList()

这仍然没有做我想要的,在这一点上我被卡住了。

【问题讨论】:

  • 请注意,Kotlin stdlib 中只读列表上的 routes.toSortedList() 之类的函数会复制列表并返回一个新列表,因此您的变量 routes 并未实际更改为排序列表,而是您制作了一个副本并因为您没有分配它而将其丢弃。 val sortedRoutes = routes.toSortedList() 然后用sortedRoutes 代替原来的列表。
  • @JaysonMinard 在 kotlin 标准库中没有这样的扩展函数 (toSortedList)。是rx.Observable的成员函数
  • 我一般说的是那种类型的函数。 toSortedList 还返回一个新的Observable,必须使用它来代替原来的是吗?同样的问题,它不会就地排序原始文件,您必须使用生成的参考。

标签: android rx-java kotlin


【解决方案1】:
val routes = cache.getRoutes()
        .observeOn(AndroidSchedulers.mainThread())

这段代码告诉我你正在处理 RxJava,它需要一个完全不同的解决方案,所以在未来包含这种类型的信息很重要。

如果cache.getRoutes() 返回Observable&lt;List&lt;Route&gt;&gt;,则可以使用代码对该路线进行排序

.map { 
    it.sortedBy(Route::route_id)
}

这将产生一个按route_id的数值排序的新内部列表。

如果cache.getRoutes() 返回Observable&lt;Route&gt;,那么您需要包含对.toList() 的额外调用以将其转换为Observable&lt;List&lt;Route&gt;&gt;

【讨论】:

  • 问题作者希望根据 routeId 编号而不是其字符串表示对路由进行排序。
  • map 操作中使用sortedBy 会更惯用,就像在@mfulton26 的答案中一样
  • @Ilya 啊,我实际上误读并认为目标是词汇排序,那是我的错
  • @Kiskae 如果您需要任何东西,比如肾脏或我的肝脏的一部分……它是您的。你为我节省了很多时间。
【解决方案2】:

如果routesMutableList 并且您想对其进行就地排序,那么您可以使用sortBy

routes.sortBy(Route::route_id)

否则,您可以使用 sortedBy 创建一个新列表,其中包含已排序的元素:

val sortedRoutes = routes.sortedBy(Route::route_id)

【讨论】:

  • 尝试这两种方法会给我接收器类型不匹配错误。 val sortedRoute = routes.sortedBy(Route::route_id)
  • routes的类型是什么? List&lt;Route&gt;?
  • @mfulton26 我建议将sortedBy 的结果分配给某个变量,否则看起来sortedByroutes 有副作用
  • 好点@Ilya。我更新了示例以将结果分配给一个新变量sortedRoutes。谢谢。
猜你喜欢
  • 2023-01-30
  • 2014-09-25
  • 1970-01-01
  • 2023-01-30
  • 2019-06-15
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多