我的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"));
第一个问题。我不想看到&#34; .csv&#34;在我的回收者视图中。所以我尝试从中删除4个字符(请参阅removeLastChar方法)。但它停留在&#34; .csv&#34;最后无论我做什么。
我想按文件的名称订购回收商视图。现在它没有按名称订购。我尝试了比较器的方法,但我不明白,我应该在那里解析我的元素。
即使我的文件没有结尾&#34; .csv&#34;,它们仍会显示在回收站视图中。看起来它会捕获文件夹中的所有文件。
更新 我可以用这个来排序我的名单(谢谢你们):
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应该是第一个...... 提前感谢您的帮助!
答案 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
希望它有所帮助!