如何按月分类月份列表

时间:2015-03-17 17:58:45

标签: java arrays date datetime time

我有一些带有年份的月份列表,例如:[12-2014,11-2012,5-2014,8-2012],我必须使用最新的对它们进行排序(或最新的日期在顶部),例如。 [12-2014,5-2014,11-2012,8-2012]
有没有人知道如何有效地在Java中做到这一点?

编辑:
YearMonth

上的课程Java 7不可用

5 个答案:

答案 0 :(得分:1)

尝试使用比较器或可比较的,并通过拆分来检查月份。

答案 1 :(得分:1)

使用自定义字符串比较器。 http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

如果您愿意,我可以写出代码。

以下是一些sudo代码:

Arrays.sort(yearList, new Comparator<String>{

    //get the year and month of o1 and o2 as ints

    //if the years are different then return the difference of the years

    //if the years are the same then return the difference of the months

}

答案 2 :(得分:1)

尝试类似(未经测试)的内容:

private final static DateTimeFormatter YEAR_MONTH_FORMATTER = 
    DateTimeFormatter.ofPattern("MM-yyyy");

...

List<String> yearMonthStrings = ...;
List<YearMont> yearMonthList = yearMonthStrings.stream()
    .map(s -> YearMonth.parse(s, YEAR_MONTH_FORMATTER)
    .sorted()
    .collect(Collectors.toList());

// or
List<YearMont> yearMonthList = yearMonthStrings.stream()
    .map(s -> YearMonth.parse(s, YEAR_MONTH_FORMATTER)
    .sorted(Collections.reverseOrder())
    .collect(Collectors.toList());

答案 3 :(得分:1)

由于您使用的是Java 7,因此您可以利用Date类以及Comparator接口及其在Set对象中的用法,例如treeSet。

以下是Comparator接口的实现,用于比较两个日期

public class MonthYearComparator implements Comparator<Date> {

    public int compare(Date o1, Date o2) {
        // TODO Auto-generated method stub
        return -1*o1.compareTo(o2);
    }

}

接下来是我们如何使用它。首先,我将使用SimpleDateFormat类将您的字符串解析为日期。要做到这一点,我需要完成它们并使它们看起来像格式化日期字符串。由于这一天与比较无关,我可以像#34; 01&#34;

那样

我将它们转换为Date对象后,我会将它们添加到TreeSet的一个实例中,该实例随Comparator一起提供,它们会在我添加它们时自动排序。

然后我可以减去我需要的日期部分,这部分日期对象的子字符串(3)被格式化为字符串。

以下是代码(为了演示,我使用了您提供的相同数据作为示例):

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class MonthYearIssue {

    private List<String> listOfMonthYears = new ArrayList<String>();
    private static final String USED_DATE_FORMAT = "dd-MM-yyyy";
    SimpleDateFormat formatter = new SimpleDateFormat(USED_DATE_FORMAT);

    public void setUpMonthYearsList() {
        listOfMonthYears.add("12-2014");
        listOfMonthYears.add("11-2012");
        listOfMonthYears.add("5-2014");
        listOfMonthYears.add("8-2012");
    }

    public Date parseToDate(String monthYearString) throws ParseException {
        return formatter.parse("01-" + monthYearString);
    }

    public List<String> doSort() throws ParseException {

        List<String> result = new ArrayList<String>();
        Set<Date> dates = new TreeSet<Date>(new MonthYearComparator());

        for (String monthYearStr: listOfMonthYears) {
            dates.add(parseToDate(monthYearStr));

        }

        for (Object d: dates.toArray()) {

            result.add(formatter.format((Date)d).substring(3));
        }

        System.out.println(result);
        return result;

    }

    public static void main(String[] args) throws ParseException {
        MonthYearIssue issueSolver = new MonthYearIssue();
        issueSolver.setUpMonthYearsList();
        issueSolver.doSort();
    }

}

结果如下:

[12-2014,05-2014,11-2012,08-2012]

答案 4 :(得分:1)

类Date是可比较的,因此您可以为数组中的每个String创建一个Date实例,然后您可以对它们进行排序