ArrayList <string>按名称排序

时间:2016-04-01 14:11:56

标签: android arraylist

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

文件具有以下结构:

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. 第一个问题。我不想看到&#34; .csv&#34;在我的回收者视图中。所以我尝试从中删除4个字符(请参阅removeLastChar方法)。但它停留在&#34; .csv&#34;最后无论我做什么。

  2. 我想按文件的名称订购回收商视图。现在它没有按名称订购。我尝试了比较器的方法,但我不明白,我应该在那里解析我的元素。

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

  4. 更新 我可以用这个来排序我的名单(谢谢你们):

        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
    

    有什么简单的解决办法吗?或者我应该实施写作&#34; 0&#34;用户创建文件时的文件?

    更新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应该是第一个...... 提前感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

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

更改

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

itemTexte.addAll(inFiles );

2。

Collections.sort(inFiles);

3. 请参阅针对#1的修正

答案 1 :(得分:1)

以下是更完整的比较器示例,供您用来对特殊文件名进行排序。

我已经添加了支票,以防文件格式不在&#34; *。*。*&#34;

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

答案 2 :(得分:0)

<强> 1 即可。您应该使用split来捕获fileName,我将向您展示一个示例

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

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

希望它有所帮助!