2 liuyuan19931217 liuyuan19931217 于 2016.09.06 10:28 提问

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秒
这样的数据怎么进行根据年月日时分秒进行排序?

6个回答

peceoqicka
peceoqicka   2016.09.06 11:10
已采纳

如果你说的是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();
 }
zhuzige521888
zhuzige521888 回复吓得我都初始化了: 学到了,给力
大约一年之前 回复
peceoqicka
peceoqicka 回复一个程序猿子: 那个叫做环视,表示匹配表达式左边的内容,http://www.cnblogs.com/kernel0815/p/3375249.html
大约一年之前 回复
zhuzige521888
zhuzige521888 Pattern pattern=Pattern.compile("(?<=Time:).+"); 这里的 ?<=为什么会起到匹配之后的作用?
大约一年之前 回复
octopusflying
octopusflying   2016.09.06 10:41

写一个比较器类,Comparator,然后调用Arrays.sort(arraylist, Comparator);

octopusflying
octopusflying 回复晚灯下的烟火: 划分字符串啊,用split函数,把年、月、日、时、分、秒、的数字都提取来,然后比较大小就行了。
大约一年之前 回复
liuyuan19931217
liuyuan19931217 问题是比较器的规则不知道怎么写
大约一年之前 回复
zhuzige521888
zhuzige521888   2016.09.06 11:45

整体思路就是:先把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;

}

}

hijack00
hijack00   Rxr 2016.09.06 11:56

由于字符串有固定的格式,所以有一个取巧的办法,就是直接做字符串比较,甚至都不需要提取出年月日。

hijack00
hijack00 “就是直接做字符串比较,甚至都不需要提取出年月日”,这不是说的很明白了吗。由于字符串已经有了默认的比较函数,你对字符串数组排序就和对整型数组排序一样的,甚至都不需要额外的提取年月日的处理。这就是我要表达的意思
大约一年之前 回复
zhuzige521888
zhuzige521888 怎么取巧,写下看看
大约一年之前 回复
hijack00
hijack00   Rxr 2016.09.06 13:30

首先利用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);  
}
hijack00
hijack00 回复一个程序猿子: 拼回去确实会麻烦一点,但也不是办不到。至于如何实现倒序排列,我在网上找到的说法是Arrays.sort没有降序排列的参数,但是要降序取数据可以通过从后到前循环来获取。如果对这种方法不满意,大不了就重载String或者其子类的compareTo方法
大约一年之前 回复
zhuzige521888
zhuzige521888 是听取巧的,但是很难实现需求,如:开锁成功,开箱失败你怎么拼回去,怎么控制倒序还是正序。
大约一年之前 回复
hijack00
hijack00   Rxr 2016.09.06 15:03

刚才看到@octopusflying的答案,写一个比较器类,Comparator,然后调用Arrays.sort(arraylist, Comparator);,再在Comparator里面根据我上面提出的思路进行判断,应该可以完美解决问题了。

Csdn user default icon
上传中...
上传图片
插入图片