使用Kotlin按字母排序数组

Dav*_*zel 5 kotlin

我正在为手机创建启动器,我需要按字母对应用程序进行排序。

 Appslist = ArrayList<AppInfo>()

    val i = Intent(Intent.ACTION_MAIN, null)
    i.addCategory(Intent.CATEGORY_LAUNCHER)
    val allApps = this.packageManager.queryIntentActivities(i, 0)

    for (ri in allApps) {
        val app = AppInfo()
        app.label = ri.loadLabel(this.packageManager)
        app.packageName = ri.activityInfo.packageName
        app.icon = ri.activityInfo.loadIcon(this.packageManager)
        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)
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

这是我的列表类型(我真的不知道它是否称为列表类型,但希望您能理解):

public class AppInfo {
internal var label: CharSequence? = null
internal var packageName: CharSequence? = null
internal var icon: Drawable? = null
internal var isInFav: Boolean? = false
Run Code Online (Sandbox Code Playgroud)

Jay*_*ard 10

惯用的方法是sortedByList如果要分类到列表的副本中,请使用扩展方法。或者sortByMutableList如果您要就地排序而不使用副本,请在上使用扩展名。一个ArrayList会工作的任一列表类型。

// Sort a readonly list into a copy of the list

val appsList: List<AppInfo> = ...

val sortedAppsList = appsList.sortedBy { it.label?.toString() }
Run Code Online (Sandbox Code Playgroud)

与:

// Sort a mutable list in-place

val appsList: MutableList<AppInfo> = ...

appList.sortBy { it.label?.toString() }
Run Code Online (Sandbox Code Playgroud)

如果保持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() }
Run Code Online (Sandbox Code Playgroud)

注意成员toString()上的label: CharSequence。您必须小心地对类型的引用进行排序,因为类型CharSequence是未定义的,排序的行为是什么(请参阅:https : //docs.oracle.com/javase/7/docs/api/java/lang/CharSequence.html

此接口不会优化equals和hashCode方法的常规协定。因此,比较两个实现CharSequence的对象的结果通常是不确定的。

如果CharSequences已经是一个String(可能是),则调用不会带来任何危害,toString()因为它只会返回自身。

还请记住,CharSequence必须同时处理可为空的值,并且您需要确定想要为空的位置:在列表的开头或结尾。我认为默认设置是让他们开始。


有关问题中代码的其他说明:

使用Listor 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

更简单:

if (app.packageName != "com.david.launcher" &&
        (searchWord.isBlank() || 
         app.label?.startsWith(searchWord, ignoreCase = true) == true)) {
    appsList.add(app)
}
Run Code Online (Sandbox Code Playgroud)

您应该浏览标准库,以了解可用的资源,以便为将来扩展工具包。