arraylist<String>排序问题

内容:
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函数可以比较两个日期的先后。

  1. 通过正则表达式提取时间(嫌麻烦你就直接截取):
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里面根据我上面提出的思路进行判断,应该可以完美解决问题了。