在arraylist中以数字形式对附件的内容进行排序

时间:2015-07-18 04:40:53

标签: java

我正在尝试将所有未转换的文件放在/ attachments文件夹中,然后使用java以数组形式对非转换后的附件数组进行字母数字排序。 这是我的代码

// get all non-transformed files in the /attachments folder and put in array 
File f = new File("D:\\template_export\\template\\attachments");
ArrayList<String> attachmentFiles = new ArrayList<String>(Arrays.asList(f.list()));
System.out.println("attachmentFiles :" + attachmentFiles);

我需要对以下输出进行排序:

attachmentFiles :[0.gif, 1.gif, 10.gif, 11.gif, 12.gif, 13.gif, 14.gif,
15.gif, 16.gif, 17.gif, 18.gif, 19.gif, 2.gif, 20.gif, 21.gif, 22.gif, 
23.gif, 24.gif, 25.gif, 26.gif, 27.gif, 28.gif, 29.gif, 3.gif, 30.html, 
31.messages, 32.messages, 4.gif, 5.gif, 6.gif, 7.gif, 8.gif, 9.gif]

我尝试使用以下代码:

Collections.sort(attachmentFiles);
for(String counter: attachmentFiles){
    System.out.println(counter);
}

但它没有排序。

2 个答案:

答案 0 :(得分:0)

需要什么,自定义逻辑来排序数据列表。可能是下面的解释会帮你写同样的。

Collections#sort(List<T> list, Comparator<? super T> c)
  

根据引发的顺序对指定的列表进行排序   指定比较器。列表中的所有元素必须是相互的   使用指定的比较器进行比较(即c.compare(e1,e2)   不得为任何元素e1和e2抛出ClassCastException   列表)。

这是你如何传递自定义逻辑。现在如何创建Comparator逻辑。 示例 -

List<String> attachmentFiles = ...;
Collections.sort(attachmentFiles,new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        // logic - 
        //a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second
    }
    });

答案 1 :(得分:0)

要比较两个不同长度的数字字符串,就好像它们是数字一样,需要用0个字符填充最短的字符串。

首先,有必要搜索两个字符串中的第一个点。比较他们的位置并填写0&#34;最短&#34;使用零编号,如下面的代码所示。

Collections.sort(attachmentFiles,new Comparator<String>() {
    public int compare(String o1, String o2) {
         int point1 = o1.indexOf('.');
         // If no point is present we assume it is present as last position
         if (point1 == -1) {
             point1 = o1.length();
         }
         int point2 = o2.indexOf('.');
         // If no point is present we assume it is present as last position
         if (point2 == -1) {
             point2 = o2.length();
         }
         if (point1 > point2) {
             char[] chars = new char[point1-point2];
             Arrays.fill(chars, '0');
             o2 = new String(chars) + o2;
         } else if (point1 < point2) {
             char[] chars = new char[point2-point1];
             Arrays.fill(chars, '0');
             o1 = new String(chars) + o1;
         }
         return o1.compareTo(o2);
    }
});