Идиоматическим способом является использование метода расширения sortedBy
для List
, если вы хотите отсортировать копию списка. Или используйте расширение sortBy
на MutableList
, если вы хотите выполнить сортировку на месте без копии. ArrayList
будет работать как любой тип списка.
// Sort a readonly list into a copy of the list
val appsList: List<AppInfo> = ...
val sortedAppsList = appsList.sortedBy { it.label?.toString() }
против
// Sort a mutable list in-place
val appsList: MutableList<AppInfo> = ...
appList.sortBy { it.label?.toString() }
и если держать в качестве ArrayList
, то же самое, но не идиоматично, иметь ссылку непосредственно на этот конкретный тип.
// Sort an ArrayList list into a copy of the list
val appsList: ArrayList<AppInfo> = ... // ALERT! not idiomatic
val sortedAppsList = appsList.sortedBy { it.label?.toString() }
// or if you want, feel free to sort in-place
appsList.sortBy { it.label?.toString() }
Обратите внимание на toString()
на элементе label: CharSequence
. Вы должны быть осторожны при сортировке ссылки типа CharSequence
, так как она не определена, каково ее поведение при сортировке (см .: https://docs.oracle.com/javase/7/docs/api/java/lang/CharSequence.html)
Этот интерфейс не уточняет общие контракты методов equals и hashCode. Поэтому результат сравнения двух объектов, реализующих CharSequence, вообще не определен.
Если CharSequence
уже является String
(вероятно, есть), то нет никакого вреда в вызове toString()
, поскольку он просто возвращает себя.
Также имейте в виду, что обнуляемый CharSequence
также должен быть обработан, и вам нужно решить, где вы хотите нули: в начале или в конце списка. Я думаю, что по умолчанию они идут на старт.
<Ч />
Другие примечания о вашем коде в вопросе:
Используйте интерфейс List
или MutableList
вместо конкретного класса, чтобы ссылаться на тип, и используйте методы из Kotlin stdlib для выполнения действий над списком. Также используйте val
вместо var
для ссылок, которые не изменятся ( означает, что он всегда будет указывать на один и тот же список независимо от того, может ли содержимое списка измениться ).
Ваше большое if
утверждение может быть значительно уменьшено, переходите от ...
if(app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord.toUpperCase() && searchWord != "" ||
app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord.toLowerCase() && searchWord != "" ||
app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord.capitalize() && searchWord != "" ||
app.label?.toString()!!.length >= searchWord.length && app.label?.toString()!!.substring(0, searchWord.length) == searchWord && searchWord != ""){
if(app.packageName != "com.david.launcher" ){
Appslist.add(app)
}
}
if(searchWord == ""){
if(app.packageName != "com.david.launcher"){
Appslist.add(app)
}
}
проще:
if (app.packageName != "com.david.launcher" &&
(searchWord.isBlank() ||
app.label?.startsWith(searchWord, ignoreCase = true) == true)) {
appsList.add(app)
}
Вам следует просмотреть стандартную библиотеку , чтобы получить представление о том, что доступно, и расширить свой инструментарий на будущее.