【问题标题】:ArrayList<String> order by nameArrayList<String> 按名称排序
【发布时间】:2016-04-04 21:58:58
【问题描述】:

我的 ArrayList 面临 3 个问题。它从我的 sdcard 中读取没有任何问题的文件。

文件具有以下结构:

1.3.2016.csv
2.3.2016.csv
29.2.2016.csv
30.2.2016.csv
4.2.2016.csv

这是我从 sdcard 读取文件的方法:

private List<String> getList(File parentDir) {

    ArrayList<String> inFiles = new ArrayList<String>();
    String[] fileNames = parentDir.list();
    for (String fileName : fileNames) {
        if (fileName.toLowerCase().endsWith(".csv")) {
            inFiles.add(removeLastChar(fileName));
        } else {
            File file = new File(File.separator + fileName + ".csv");
            if (file.isDirectory()) {
                inFiles.addAll(getList(((file))));
            }
        }
    }

    itemTexte.addAll(Arrays.asList(fileNames));
    return inFiles;
}

private static String removeLastChar(String str) {
    return str.substring(0,str.length()-4);
}

这是我从 onCreate 中调用的内容:

List<String> files = getList(new File(Environment.getExternalStorageDirectory() + File.separator + "Test" + File.separator + "Files"));
  1. 第一个问题。我不想在我的回收站视图中看到“.csv”。所以我尝试从中删除 4 个字符(请参阅 removeLastChar 方法)。但无论我做什么,它最后都停留在“.csv”。

  2. 我想按文件名订购回收站视图。现在它不按名称排序。我尝试了 Comparator 方法,但我不明白如何,我应该在那里解析我的元素。

  3. 即使我的文件没有以“.csv”结尾,它们仍会显示在回收站视图中。看起来它捕获了文件夹中的所有文件。

更新 我可以用这个对我的列表进行排序(谢谢):

    Collections.sort(inFiles);

但这有点不对劲... 示例:

1.3.2016
10.2.2016
11.4.2016
2.3.2016
3.3.2016

但它应该是这样的:

10.2.2016
1.3.2016
2.3.2016
3.3.2016
11.4.2016

有什么简单的解决方法吗?或者我应该在用户创建文件时实现将“0”写入文件?

更新 2

所以我添加了这个

Collections.sort(inFiles, new Comparator<String>() {

        @Override
        public int compare(String s1, String s2) {
            String[] s1Values = s1.split(".");
            String[] s2Values = s1.split(".");
            //define your comparison, arrays will have each value between '.', e.g. {"1", "3", "2016", "csv" } for "1.3.2016.csv"
            int compare_result = s1.compareTo(s2);
            return compare_result; //return -1 if s1 < s2, 0 if equal, 1 if s1 > s2
        }
    });

我的列表是这样的

01.04.2016
02.04.2016
15.04.2016
16.03.2016

但是 16.03.2016 应该是第一个... 提前感谢您的帮助!

【问题讨论】:

    标签: android arraylist


    【解决方案1】:

    1. 您的删除文件扩展名方法应该有效。我认为您的问题是您没有将新列表添加到itemTexte,而是添加了原始文件列表。

    改变

    itemTexte.addAll(Arrays.asList(fileNames));
    

    itemTexte.addAll(inFiles );
    

    2.

    Collections.sort(inFiles);
    

    3.查看#1的修复

    【讨论】:

    • 请查看更新后的问题。它几乎按照应有的方式工作。只有排序功能是错误的。还是谢谢!
    • 哦,我记得!这不是第一次了...stackoverflow.com/questions/14451976/…,对我很有帮助!
    • @Wladislaw 您将需要使用比较器。我会用一个例子来更新我的答案。
    • @Wladislaw 我已经编辑了我的答案,但留下了一些比较器的实现,因为您可以决定如何订购它们。
    • @JamesWierzba 你能检查一下你的代码有什么问题吗?我的意思是当我实现它时,它看起来甚至没有对它进行排序......看看更新的问题。
    【解决方案2】:

    这是比较器的更完整示例,可用于对特殊文件名进行排序。

    我添加了检查,以防文件不是“*.*.*”形式

        Collections.sort(inFiles, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2)
            {
                String[] s1Values = s1.split("\\.");
                String[] s2Values = s2.split("\\.");
                //compare the year
                if(s1Values.length >= 3 && s2Values.length >= 3)
                {
                    int compare = s1Values[2].compareTo(s2Values[2]);
                    if(compare != 0) return compare;
                }
                //compare the month
                if(s1Values.length >= 2 && s2Values.length >= 2)
                {
                    int compare = s1Values[1].compareTo(s2Values[1]);
                    if(compare != 0) return compare;
                }
                //compare the day
                if(s1Values.length >= 1 && s2Values.length >= 1)
                {
                    int compare = s1Values[0].compareTo(s2Values[0]);
                    if(compare != 0) return compare;
                }
                return 0; 
            }
        });
    

    【讨论】:

      【解决方案3】:

      1。你应该使用split 来捕获文件名,我会直接给你一个例子

      2。要按字母顺序排序,请执行java.util.Collections.sort(listOfCSV)

      String string = "fileName.csv";
      String[] parts = string.split(".");
      String firstPart = parts[0]; // fileName
      String secondPart = parts[1]; // csv
      

      希望对你有帮助!

      【讨论】:

      • 请查看更新后的问题。它几乎按照应有的方式工作。只有排序功能是错误的。还是谢谢!
      • 哦,我记得!这不是第一次...stackoverflow.com/questions/14451976/…,对我有很大帮助!很简单,使用 Comparator
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多