如何对ArrayList进行排序包括Date和String?

时间:2011-06-30 11:08:28

标签: java

我想按日期对ArrayList进行排序。 我的ArrayList为:

10 June - name
15 April - name
23 July - name
03 March - name

它有日,月和字符串名称。我如何按日期排序?

由于

7 个答案:

答案 0 :(得分:6)

正如@The Elite Gentleman所指出的那样,你应该使用自定义比较器。这是一个完整的例子:

import java.text.*;
import java.util.*;
public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(
                Arrays.asList("10 June - name", 
                              "15 April - name", 
                              "23 July - name", 
                              "03 March - name"));

        // Print list before sorting.
        System.out.println(list);

        // Sort list according to date.
        Collections.sort(list, new Comparator<String>() {
            DateFormat df = new SimpleDateFormat("dd MMM");
            @Override
            public int compare(String s1, String s2) {
                try {
                    Date d1 = df.parse(s1.split("-")[0].trim());
                    Date d2 = df.parse(s2.split("-")[0].trim());
                    return d1.compareTo(d2);
                } catch (ParseException pe) {
                    System.out.println("erro: " + pe);
                    return 0;
                }
            }
        });

        // Print list after sorting
        System.out.println(list);
    }
}

<强>输出:

[10 June - name, 15 April - name, 23 July - name, 03 March - name]
[03 March - name, 15 April - name, 10 June - name, 23 July - name]

更好的想法可能会将日期/名称对封装到一个单独的类中。这样就可以避免每次需要将字符串用于这些类型的目的时解析字符串。 )

答案 1 :(得分:4)

您可以编写自己的日期Comparator并使用Collections.sort(List<T>, Comparator<? super T> c);方法对其进行排序。

答案 2 :(得分:1)

查看ComparatorComparable

答案 3 :(得分:0)

在Collections类中有一个名为sort(...)的静态方法,您可以在其中传递列表和比较器。

创建一个比较器,比较列表中的值并返回适当的值。

答案 4 :(得分:0)

这里有一个例子:

List<Date> dates=new ArrayList<Date>();
dates.add(new Date(System.currentTimeMillis()));
dates.add(new Date(System.currentTimeMillis()+231892738));
dates.add(new Date(System.currentTimeMillis()-742367634));
for(Date d:dates)
    System.out.println(d);
Collections.sort(dates);
for(Date d:dates)
    System.out.println(d);

或者您可以使用自定义比较器

Collections.sort(dates,customComparator);

答案 5 :(得分:0)

尝试对您的案例使用Collections.sort方法:

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

    @Override
    public int compare(String s1, String s2) {
          // perform the comparison here and returns a negative integer,
          // zero, or a positive integer as the first argument is less than,
          // equal to, or greater than the second 
    }
    });

答案 6 :(得分:0)

创建一个将该日期字符串转换为int的函数? 即。

str2int("name 10 June") => 610
str2int("name 15 Jan")  => 115

int str2int(String s){
    String[] elms = s.split("\\s+");
    // ignore first argument which is name
    int day = Integer.parseInt(elms[1]);
    int month = month2int(elms[2]);
    return day + month;
}

// month2int("Jan") => 100
// month2int("Feb") => 200
// .
// .
// month2int("Dec") => 1200

// you get the idea :-)

使用比较器比较那些字符串......