我有一些带有年份的月份列表,例如:[12-2014,11-2012,5-2014,8-2012]
,我必须使用最新的对它们进行排序(或最新的日期在顶部),例如。 [12-2014,5-2014,11-2012,8-2012]
。
有没有人知道如何有效地在Java
中做到这一点?
编辑:
YearMonth
Java 7
不可用
答案 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实例,然后您可以对它们进行排序