按字母数字排序对象

时间:2016-09-12 15:01:52

标签: android rx-java kotlin

我在尝试排序"路由"时遇到了问题。对于我的应用程序,无论我尝试什么,我都无法获得我正在寻找的排序。

我希望它排序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

但仍然没有,我只是想通过&#34; route_id&#34;对路线进行排序,我尝试了几个不同的东西,最后一个是

routes.toSortedList()

仍然没有做我想做的事情,此时我被困住了。

2 个答案:

答案 0 :(得分:4)

val routes = cache.getRoutes()
        .observeOn(AndroidSchedulers.mainThread())

此代码告诉我您正在处理RxJava,这需要一个完全不同的解决方案,因此将来重要的是包含这类信息。

如果cache.getRoutes()返回Observable<List<Route>>,则可以使用代码

对该路线进行排序
.map { 
    it.sortedBy(Route::route_id)
}

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

如果cache.getRoutes()返回Observable<Route>,则您需要添加对.toList()的额外调用,将其变为Observable<List<Route>>

答案 1 :(得分:2)

如果routesMutableList并且您想要就地排序,那么您可以使用sortBy

routes.sortBy(Route::route_id)

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

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