Java 为字符串排序Arraylist,但仅按日期排序

Java 为字符串排序Arraylist,但仅按日期排序,java,sorting,arraylist,Java,Sorting,Arraylist,我有一个arraylist,其中包含“2013-7-13\n 12小时23分钟”此类记录。我怎样才能只按日期排序 一段代码: String date1 = c.getString(c.getColumnIndex(TabProDB.KEY_DATE) ); String time1 = c.getString(c.getColumnIndex(TabProDB.KEY_TIME) ); String date_time1 = date1 + "\n" +time1; Toast.makeText

我有一个arraylist,其中包含
“2013-7-13\n 12小时23分钟”
此类记录。我怎样才能只按日期排序

一段代码:

String date1 = c.getString(c.getColumnIndex(TabProDB.KEY_DATE) );
String time1 = c.getString(c.getColumnIndex(TabProDB.KEY_TIME) );
String date_time1 = date1 + "\n" +time1;
Toast.makeText(History.this, date_time1, Toast.LENGTH_SHORT).show();
listItems.add(date_time1);

可以向Array.sort传递自定义比较器。如果您知道所有字符串都是完全相同的格式,只需基于子字符串创建比较器即可


您也可以实现自己的排序,但这并不理想,因为Java已经提供了该功能。

您可以尝试执行的步骤

-->如果您确定每个条目中都有“\n”可用,例如y,则使用org.apache.commons.lang.StringUtils.substringBefore(String,String)例如x,仅从每个条目中获取日期部分

-->下一步是使用java.text.simpleDataFormat(yyyy-mm-dd)

-->然后,您可以使用任何可以包含键和值对的集合对象,其中键是x,值是y(使用TreeMap这可以自动对值进行排序。)

此方法的问题:如果阵列的多个条目中存在x部分,则此方法将不起作用


尝试运行此代码。最后一个print语句将为您提供排序结果。地图中的值就是您要查找的值

class TestClass {
    public void checkThis() throws ParseException {
        String[] sampleValues = new String[3];
        sampleValues[0]= "2013-7-13 \n 12 hour(s) 23 minute(s) ";
        sampleValues[1]= "2013-8-14 \n 12 hour(s) 23 minute(s) ";
        sampleValues[2]= "2013-5-16 \n 12 hour(s) 23 minute(s) ";
        System.out.println("--> before"+ sampleValues);

        String x= null;
        Date date =null;
        Map<Date, String> map = new TreeMap<Date, String>();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        for (String y : sampleValues) {
            x = StringUtils.substringBefore(y, " \n");
            date= formatter.parse(x);           
            map.put(date, y);
        }

        System.out.println(map.keySet());
    }
}
class测试类{
public void checkThis()引发ParseException异常{
String[]sampleValues=新字符串[3];
样本值[0]=“2013-7-13\n 12小时23分钟”;
样本值[1]=“2013-8-14\n 12小时23分钟”;
样本值[2]=“2013-5-16\n 12小时23分钟”;
System.out.println(“->”在“+采样值”之前);
字符串x=null;
日期=空;
Map Map=newtreemap();
SimpleDataFormat格式化程序=新的SimpleDataFormat(“yyyy-MM-dd”);
用于(字符串y:采样值){
x=StringUtils.substringBefore(y,“\n”);
date=formatter.parse(x);
地图放置(日期,y);
}
System.out.println(map.keySet());
}
}

创建自己的
比较器
实现,如下所示:

请注意,没有错误检查,它只是向您展示如何执行

 public static void main(String[] args) {

    List<String> strings =
        Arrays.asList("2013-7-13 \n 12 hour(s) 23 minute(s)",
            "2013-7-10 \n 12 hour(s) 23 minute(s)");

    Collections.sort(strings, new Comparator<String>() {

      @Override
      public int compare(String o1, String o2) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

        Date date1;
        Date date2;
        try {
          date1 = format.parse(o1.split(" ")[0]);
          date2 = format.parse(o2.split(" ")[0]);
        } catch (ParseException e) {
          throw new IllegalArgumentException("Could not parse date!", e);
        }

        return date1.compareTo(date2);
      }
    });


    System.out.println(strings);

  }
publicstaticvoidmain(字符串[]args){
列表字符串=
Arrays.asList(“2013-7-13\n 12小时23分钟)”,
“2013-7-10\n 12小时23分钟”;
Collections.sort(字符串、新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
SimpleDateFormat=新的SimpleDateFormat(“yyyy-MM-dd”);
日期1;
日期2;
试一试{
date1=format.parse(o1.split(“”[0]);
date2=format.parse(o2.split(“”[0]);
}捕获(解析异常){
抛出新的IllegalArgumentException(“无法解析日期!”,e);
}
返回日期1.与(日期2)相比;
}
});
System.out.println(字符串);
}

虽然你应该遵循面向对象的风格,将传递的日期和时间作为类对象。。。然后用这个类做一个数组列表。。 无论如何。。。这段代码可能会帮助你

请记住字符串比较和日期和时间比较是两种 不同的是,你也可以根据你的需要重构下面的代码

List dateTimeList=new ArrayList
Collections.sort(dateTimeList,new MyComparator());
第一步

字符串
解析为实际的
日期
对象`:

final String s = "2013-7-13 \n 12 hour(s) 23 minute(s)";
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-dd \n hh 'hour(s)' 23 'minute(s)'");
final Date d = sdf.parse(s);
不要将日期存储为字符串

第二步

将所有新的
日期
放入
列表
并调用
集合。排序

在以后的任何时候,您都可以使用相同的
SimpleDateFormat
(或完全不同的格式)将
日期重新格式化为
字符串

final String form = sdf.format(d);
System.out.println(form);
输出:

2013-7-13\n 12小时23分钟


使用自定义类!!包含日期对象和日期字符串表示形式的类是时间戳的arraylist还是将时间戳作为其属性之一的对象的arraylist。在millennium中,逐个比较对象。给定上述结构,您只需使用一个比较器,它只需调用字符串参数的compare()方法。看看集合。排序(列表、比较);这可能会解决你说的问题。因为“x”,例如“12小时23分钟”将有重复记录。这可能会起作用。你能给我一些实际的代码吗,我不熟悉树形图,谢谢,为什么我需要dateTimeList呢?我已经有了一个名为“listItems”@user2799726的列表,它只是一个变量名,因为在代码中date_time1是日期和时间的串联。。。
List<String> dateTimeList = new ArrayList<String>
Collections.sort(dateTimeList, new MyComparator());
final String s = "2013-7-13 \n 12 hour(s) 23 minute(s)";
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-dd \n hh 'hour(s)' 23 'minute(s)'");
final Date d = sdf.parse(s);
final String form = sdf.format(d);
System.out.println(form);