【问题标题】:How to sort MutableList<File> using Collator?如何使用 Collat​​or 对 MutableList<File> 进行排序?
【发布时间】:2021-01-16 14:58:55
【问题描述】:

我想使用Collator.getInstance(Locale.ENGLISH)listFiles() 的输出进行排序。 我该怎么做?

    val path = File(Os.getenv("EXTERNAL_STORAGE"))
    val filefilter = FileFilter { file -> file.isDirectory && !file.isHidden }
    val fileList = path.listFiles(filefilter)!!.toList()
    Collections.sort(fileList, Collator.getInstance(Locale.ENGLISH))

我得到的错误是

java.lang.ExceptionInInitializerError
    at com.praps.myapplication.ui.list.ListFragment.onCreateView(ListFragment.kt:43)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
    at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
    at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:221)
    at android.app.ActivityThread.main(ActivityThread.java:7520)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
 Caused by: java.lang.ClassCastException: java.io.File cannot be cast to java.lang.String
    at java.text.Collator.compare(Collator.java:277)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
    at java.util.TimSort.sort(TimSort.java:220)
    at java.util.Arrays.sort(Arrays.java:1492)
    at java.util.ArrayList.sort(ArrayList.java:1470)
    at java.util.Collections.sort(Collections.java:206)
    at com.praps.myapplication.ui.list.dummy.DummyContent

【问题讨论】:

    标签: java android file kotlin


    【解决方案1】:

    您正在尝试用Comparator&lt;String&gt;Array&lt;File&gt; 进行排序,这就是原因。没有类型警告,因为Collator 实际上是Comparator&lt;Any&gt;,但它的实现RuleBasedCollator 不是,它只比较字符串。

    您需要制作一个中间比较器,它获取文件名并进行比较:

    val files = dir.listFiles().orEmpty()
    val collator = Collator.getInstance(Locale.ENGLISH);
    files.sortWith { a, b -> collator.compare(a.name, b.name) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 2020-05-23
      • 2012-01-10
      • 2017-03-13
      相关资源
      最近更新 更多