2

I want to sort the output from listFiles() using Collator.getInstance(Locale.ENGLISH). How do I do it?

    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))

The error I get is

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

1 Answer 1

1

You're trying to sort a Array<File> with a Comparator<String>, that's why. There's no type warning because Collator is actually a Comparator<Any>, but its implementation RuleBasedCollator isn't, it only compares strings.

You need to make an intermediate comparator that takes the name of the files and compare that:

val files = dir.listFiles().orEmpty()
val collator = Collator.getInstance(Locale.ENGLISH);
files.sortWith { a, b -> collator.compare(a.name, b.name) }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.