如何保持DateList的DateList始终排序

时间:2015-01-19 15:30:57

标签: java android sorting arraylist

我目前正在使用AsyncTask()从3个不同的xmls中获取RSS Feed,

for (int i = 0; i < urls.length; i++) {
                GetDates currentBlog = new GetDates(i);
                currentBlog.execute();
            }

我正在使用DOM解析器从每个xml feed中读取日期,如下所示

eElement.getElementsByTagName(pubDate).item(0).getTextContent())

所有日期都被提取为String,然后使用Date转换为SimpleDateFormatter对象,然后存储在ArrayList

由于日期是从3个不同的Feed中提取并存储在ArrayList中,因此ArrayList未排序,

以下是ArrayList

中的数据
// First Feed
Sun Jan 18 22:07:35 GMT+05:00 2015
Sat Jan 17 06:02:05 GMT+05:00 2015
Sat Jan 17 01:34:10 GMT+05:00 2015
Fri Jan 16 22:58:32 GMT+05:00 2015
Fri Jan 16 01:56:06 GMT+05:00 2015
Thu Jan 15 21:46:18 GMT+05:00 2015
Thu Jan 15 01:57:09 GMT+05:00 2015
Wed Jan 14 22:47:15 GMT+05:00 2015
Wed Jan 14 01:05:22 GMT+05:00 2015
Tue Jan 13 21:59:15 GMT+05:00 2015
Tue Jan 13 17:14:11 GMT+05:00 2015
Tue Jan 13 15:03:06 GMT+05:00 2015
Tue Jan 13 12:31:12 GMT+05:00 2015
Tue Jan 13 06:01:12 GMT+05:00 2015
// Second Feed Starts here
Sat Jan 17 01:56:00 GMT+05:00 2015
Fri Jan 16 19:23:30 GMT+05:00 2015
Fri Jan 16 05:07:00 GMT+05:00 2015
Fri Jan 16 09:07:00 GMT+05:00 2015
Wed Jan 14 02:44:00 GMT+05:00 2015
// Third Feed Starts here
Sat Jan 17 01:56:00 GMT+05:00 2015
Fri Jan 16 19:23:30 GMT+05:00 2015
Fri Jan 16 05:07:00 GMT+05:00 2015
Fri Jan 16 09:07:00 GMT+05:00 2015
Wed Jan 14 02:44:00 GMT+05:00 2015

我想对ArrayList进行排序,所以我使用Comparator类来做,但问题是我必须等到所有3个Feed中的数据都被加载才能开始排序。

这就是我正在做的事,

if (allfeedsareloaded == true)
   // Start sorting here

我了解到我可以使用TreeSet类来保持对象的排序,但我不知道如何使用它?

有没有其他方法可以在不使用大量内存或时间的情况下始终对数据进行排序?

2 个答案:

答案 0 :(得分:2)

如果您的比较器已经正常工作,使用TreeSet就像

一样简单
   Set<String> ts = new TreeSet<String>(yourComparator);
   ts.add(yourStringDate);

此外,由于您提到您已经转换为日期,您应该遵循@SubOptimal在其答案中所说的内容,您不需要自定义分区,日期实例将按其自然顺序排序。对于您在提交内容中的问题,您应该在解析提要之前初始化TreeSet,并且在将节点值转换为Date存储的时刻,在伪代码中

    SortedSet sortedSet = Collections.synchronizedSortedSet(new TreeSet<Date>());
    asyncTask1 // fetch parse and add to set from source 1
    asyncTask2 // fetch parse and add to set from source 2
    asyncTask3 // fetch parse and add to set from source 3
    System.out.println(datesSet); // no further action elements are already 

根据您的描述,您的设置可以同时更新,因此将其初始化为SortedSet sortedSet = Collections.synchronizedSortedSet(new TreeSet<Date>());

答案 1 :(得分:2)

如果您创建TreeSet,则会关注日期的natural order

编辑更新示例以包含具有已排序ArrayList的解决方案

Calendar cal = GregorianCalendar.getInstance();

Set<Date> datesSet = new TreeSet<>();
cal.set(2015, Calendar.MAY, 10);
datesSet.add(cal.getTime());

cal.set(2015, Calendar.MAY, 1);
datesSet.add(cal.getTime());
datesSet.add(cal.getTime());

cal.set(2015, Calendar.MAY, 5);
datesSet.add(cal.getTime());

// all May dates
System.out.printf("%nTreeSet: output in natural order, no duplicates%n");
for (Date d : datesSet) {
    System.out.println(d);
}

List<Date> datesList = new ArrayList<>();
cal.set(2015, Calendar.MAY, 10);
datesList.add(cal.getTime());

cal.set(2015, Calendar.MAY, 1);
datesList.add(cal.getTime());
datesList.add(cal.getTime());

cal.set(2015, Calendar.MAY, 5);
datesList.add(cal.getTime());

System.out.printf("%nArrayList: output in insertion order, duplicates possible%n");
for (Date d : datesList) {
    System.out.println(d);
}

Collections.sort(datesList);
System.out.printf("%nArrayList: output in natural order, duplicates possible%n");
for (Date d : datesList) {
    System.out.println(d);
}