【问题标题】:How to keep ArrayList of Date stay sorted at all times如何保持日期的 ArrayList 始终保持排序
【发布时间】:2015-01-19 15:30:57
【问题描述】:

我目前正在使用AsyncTask() 从 3 个不同的 xml 中获取 rss 提要,就像这样,

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

我正在使用 DOM 解析器从每个 xml 提要中读取日期,就像这样,

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

所有日期都作为String获取,然后使用SimpleDateFormatter转换为Date对象,然后存储在ArrayList中。

由于日期是从 3 个不同的提要中获取并存储在 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 个提要的数据都加载完毕才能开始排序。

这就是我正在做的,

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

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

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

【问题讨论】:

标签: java android sorting arraylist


【解决方案1】:

如果您创建一个TreeSet,它将继续关注日期的natural order

edit 更新示例以包含具有排序 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);
}

【讨论】:

    【解决方案2】:

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

       Set<String> ts = new TreeSet<String>(yourComparator);
       ts.add(yourStringDate);
    

    此外,由于您提到您已经转换为日期,您应该遵循@SubOptimal 在他的回答中所说的内容,您不需要自定义比较器,日期实例将按其自然顺序排序。对于您在评论中的问题,您应该在解析提要之前初始化一个 TreeSet,并且在您将节点值转换为内部存储的日期时,因此在伪代码中

        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&lt;Date&gt;());

    【讨论】:

    • 它对我的情况有什么帮助,你能补充一些细节吗?
    • 另外,在哪里添加此代码?加载完所有提要后?
    • 我添加了一个伪代码,主要是在解析提要之前初始化一个 TreeSet,而不是在将节点值转换为 Date 实例之后添加它,它会排序自动
    • 还要确保将SortedSet的泛型类型更改为Date,--SortedSet&lt;Date&gt;
    猜你喜欢
    • 2018-06-23
    • 2021-04-15
    • 2011-06-24
    • 2011-02-07
    • 2013-05-09
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多