-1

我有一个包含"2013-7-13 \n 12 hour(s) 23 minute(s) "此类记录的数组列表。我怎样才能只按日期排序。

一段代码:

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);
4

5 回答 5

2

创建您自己的Comparator<String>实现,如下所示:

请注意,没有错误检查,它只是向您展示如何做到这一点。

 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);

  }
于 2013-10-06T14:27:18.460 回答
1

虽然你应该遵循面向对象的风格,将日期和时间作为类对象传递......并从这个类中创建一个 Arraylist ......无论如何......这段代码可能会帮助你!

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

public class MyComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        int result = o1.compareTo(o2);
        return result;
    }
}
Now use Collection.sort method
List<String> dateTimeList = new ArrayList<String>
Collections.sort(dateTimeList, new MyComparator());
于 2013-10-06T14:28:01.390 回答
0

您可以尝试执行的步骤...

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

--> 下一步是使用java.text.SimpleDateFormat (yyyy-mm-dd)将 x 解析为 Date

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

这种方法的问题:如果部分 x 在您的数组的多个条目中很常见,则此方法将不起作用。


尝试运行此代码。最后一个打印语句将为您提供排序结果。map 里面的值就是你要找的。

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());
    }
}
于 2013-10-06T14:25:34.080 回答
0

第一步

将您解析String为实际Date对象`:

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);

不要将日期存储为字符串

第二步

将所有这些新Date的 s 放入您的List并调用Collections.sort

在以后的任何时候,您都可以使用相同的SimpleDateFormat(或完全不同的)将您的Date背部格式化为String

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

输出:

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

于 2013-10-06T14:29:23.690 回答
0

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

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

于 2013-10-06T14:19:28.907 回答