内容:
app开锁成功
Time:16年09月05日 15时58分46秒
app开箱失败
Time:16年09月05日 15时59分45秒
app开锁成功
Time:16年09月05日 15时57分40秒
这样的数据怎么进行根据年月日时分秒进行排序?
如果你说的是List中一条数据就是 “app开锁成功\nTime:16年09月05日 15时57分40秒”,
那么可以使用正则表达式匹配并提取时间,然后通过SimpleFormatDate将其转换为Calendar对象,
通过Calendar对象的before和after函数可以比较两个日期的先后。
String str="app开锁成功\nTime:16年09月05日 15时57分40秒";
Pattern pattern=Pattern.compile("(?<=Time:).+");
Matcher matcher=pattern.matcher(str);
if(matcher.find()){
System.out.println("提取的时间为:\t"+matcher.group());
}
将时间字符串转换为Calendar对象并比较时间先后:
String date = matcher.group();
//紧接前面的提取代码,这里的代码都是demo
System.out.println("提取的时间为:\t" + date);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy年MM月dd日 HH时mm分ss秒", Locale.getDefault());
try {
Date da = simpleDateFormat.parse(date);
Calendar calendar = Calendar.getInstance();
calendar.setTime(da);
Calendar another = Calendar.getInstance();
if (another.after(calendar)) {
System.out.println("今天(" + simpleDateFormat.format(another.getTime()) + ")在" + simpleDateFormat.format(calendar.getTime()) + "之后");
} else {
System.out.println("今天(" + simpleDateFormat.format(another.getTime()) + ")在" + simpleDateFormat.format(calendar.getTime()) + "之前");
}
} catch (ParseException e) {
e.printStackTrace();
}
写一个比较器类,Comparator,然后调用Arrays.sort(arraylist, Comparator);
整体思路就是:先把list转为String数组,然后创建比较器,比较器里进行字符串截取,再把日期字符串转为long进行比较排序。最后输出。代码如下
package com.neusoft.duan.testComparator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
public class ComparatorT {
public static void main(String[] args){
List arraylist = new ArrayList();
arraylist.add("app开锁成功Time:16年09月05日 15时58分46秒");
arraylist.add("app开箱失败Time:16年09月05日 15时59分45秒");
arraylist.add("app开锁成功Time:16年09月05日 15时57分40秒");
//创建比较器
Comparator cpt = new Comparator(){
public int compare(String o1, String o2) {
String s1 = (String) o1;
String s2 = (String) o2;
String ss1= "20"+s1.substring(12, s1.length());
String ss2= "20"+s2.substring(12, s2.length());
long ds1;
long ds2;
try {
ds1 = stringToLong(ss1,"yyyy年MM月dd日 HH时mm分ss秒");
ds2 = stringToLong(ss2,"yyyy年MM月dd日 HH时mm分ss秒");
return (int) (ds1 - ds2);
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
public int compare(Object o1, Object o2) {
if (o1 instanceof String) {
return compare( (String) o1, (String) o2);
}else if (o1 instanceof Integer) {
return compare( (Integer) o1, (Integer) o2);
}else {
System.err.println("未找到合适的比较器");
return 1;
}
}
};
//转为数组
String[] arrayStr = new String[arraylist.size()];
for(int i=0;i<arraylist.size();i++){
arrayStr[i]=arraylist.get(i);
}
//执行排序
Arrays.sort(arrayStr, cpt);
//排序后输出
for (int i = 0; i < arrayStr.length; i++) {
System.out.println(arrayStr[i]);
}
}
// strTime要转换的String类型的时间
// formatType要转换的格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日
// strTime的时间格式和formatType的时间格式必须相同
public static long stringToLong(String strTime, String formatType)
throws ParseException {
Date date = stringToDate(strTime, formatType); // String类型转成date类型
if (date == null) {
return 0;
} else {
long currentTime = date.getTime();; // date类型转成long类型
return currentTime;
}
}
public static Date stringToDate(String strTime, String formatType)
throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat(formatType);
Date date = null;
date = formatter.parse(strTime);
return date;
}
}
由于字符串有固定的格式,所以有一个取巧的办法,就是直接做字符串比较,甚至都不需要提取出年月日。
首先利用String.substring提取原始字符串中"Time:xx年xx月xx日 xx时xx分xx秒"这部分内容,然后直接对这部分内容组成的字符串数组进行排序,参考代码如下
import java.util.Arrays;
String[] timestr = new String[]{"Time:16年09月05日 15时58分46秒", "Time:16年09月05日 15时59分45秒", "Time:16年09月05日 15时57分40秒"};
Arrays.sort(timestr);
for(String str : timestr) {
System.out.println(str);
}
刚才看到@octopusflying的答案,写一个比较器类,Comparator,然后调用Arrays.sort(arraylist, Comparator);
,再在Comparator里面根据我上面提出的思路进行判断,应该可以完美解决问题了。