输入是一个包含字符串格式日期的列表。我有如下解决方案。但是我觉得可以提高效率。任何帮助将不胜感激。
//映射以存储月份数据
HashMap<String,String> month = new HashMap<String,String>();
month.put("Jan","01");
month.put("Feb","02");
month.put("Mar","03");
month.put("Apr","04");
month.put("May","05");
month.put("Jun","06");
month.put("Jul","07");
month.put("Aug","08");
month.put("Sep","09");
month.put("Oct","10");
month.put("Nov","11");
month.put("Dec","12");
您可以将其视为输入
String[] input = {"20 Oct 2052",
"26 May 1960",
"06 Jun 1933",
"06 Jun 1933",
"06 Jun 1933",
};
ArrayList<Long> temp1 = new ArrayList<Long>();
比较结果
HashMap<Long,String> temp2 = new HashMap<Long,String>();
ArrayList<String> result = new ArrayList<String>();
for(int i = 0 ; i< input.length ; i++){
String j = "";
if(input[i].length() == 11){
j+= input[i].substring(7,11);
j+= month.get(input[i].substring(3,6));
j+=input[i].substring(0,2);
temp1.add(Long.parseLong(j));
temp2.put(Long.parseLong(j), input[i]);
}
}
排序结果
Collections.sort(temp1);
打印结果
System.out.println(temp1.toString());
答案 0 :(得分:2)
Radix Sort是您的朋友。只需使用此算法对字符串进行排序。这是最佳解决方案。
答案 1 :(得分:2)
首先,我将日期字符串解析为Date对象
DateFormat format = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH);
Date date = format.parse("26 May 1960");
您可以创建一个包含Date对象的对象,然后使其具有可比性。
public class DateContainer implements Comparable<DateContainer > {
private Date dateTime;
public DateContainer (Date date){
this.dateTime = date;
}
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date datetime) {
this.dateTime = datetime;
}
@Override
public int compareTo(DateContainer o) {
return getDateTime().compareTo(o.getDateTime());
}
}
然后您可以在上方创建对象列表,然后使用“收藏夹”对其进行排序
Collections.sort(myList);
答案 2 :(得分:1)
public static void main(String[] args) {
SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy");
String[] input = {"20 Oct 2052",
"26 May 1960",
"06 Jun 1933",
"06 Jun 1933",
"06 Jun 1933",
};
Map<Long, String> result = new TreeMap<>();
Stream.of(input)
.filter(s -> s.length() == 11)
.forEach(s -> {
try {
result.put(f.parse(s).getTime(), s);
} catch (ParseException e) {
System.out.println("Wrong Format: " + s);
}
});
System.out.println(result); // {-1154156400000=06 Jun 1933, -303033600000=26 May 1960, 2612970000000=20 Oct 2052}
}
使用SimpleDateFormat获取日期值,并使用TreeMap来对地图中已排序的元素进行
。希望对您有帮助!!!!
答案 3 :(得分:1)
这应该可以解决问题
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMM yyyy");
List<Date> dates = Arrays.stream(input).map(dateString -> {
try {
return simpleDateFormat.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}).collect(Collectors.toList());
dates.sort(Comparator.naturalOrder());
dates.forEach(date -> System.out.println(simpleDateFormat.format(date)));
这是一个两步过程
希望这会有所帮助!
祝你好运!
答案 4 :(得分:1)
这是使用现代 java.time 类和lambda语法的单行代码。
将每个字符串解析为LocalDate
,收集,排序并重新生成字符串作为输出。
Arrays.stream(
new String[] { "20 Oct 2052" , "26 May 1960" , "06 Jun 1933" , "06 Jun 1933" , "06 Jun 1933" }
)
.map( input -> LocalDate.parse( input , DateTimeFormatter.ofPattern( "dd MMM uuuu" , Locale.US ) ) )
.sorted()
.map( date -> date.format( DateTimeFormatter.ofPattern( "dd MMM uuuu" , Locale.US ) ) )
.collect( Collectors.toList() )
.toString()
[1933年6月6日,1933年6月6日,1933年6月6日,1960年5月26日,2052年10月20日]
步骤:
LocalDate
LocalDate
对象LocalDate
上生成表示其值的文本。List
中。使用适当的数据类型,而不仅仅是字符串。
对于没有日期和时区的仅日期值,请使用LocalDate
类。
定义一种格式设置以匹配您的输入。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd MMM uuuu" , Locale.US );
循环输入,将每个输入解析为LocalDate
。将每个结果LocalDate
收集到List
中。
List < LocalDate > dates = new ArrayList <>( inputs.length );
for ( String input : inputs ) {
LocalDate ld = LocalDate.parse( input , f );
dates.add( ld );
}
或者,请使用简短的lambda语法。
List < LocalDate > dates = Arrays.stream( inputs ).map( input -> LocalDate.parse( input , f ) ).collect( Collectors.toList() );
排序LocalDate
对象的列表。
Collections.sort( dates );
以标准ISO 8601格式报告您的排序日期。
String outputs = dates.toString() ;
[1933-06-06,1933-06-06,1933-06-06,1960-05-26,2052-10-20]
以任何所需的格式报告您的排序日期。
List < String > outputs = new ArrayList <>( dates.size() );
for ( LocalDate date : dates ) {
outputs.add( date.format( f ) );
}
[1933年6月6日,1933年6月6日,1933年6月6日,1960年5月26日,2052年10月20日]
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。