在java中对收集数组列表对象的集合进行排序

问题描述:

Class ParentClass 
    { 
    private List<ChildClass>; 
    } 

    Class ChildClasss 
    { 

    private Date date; 
    } 

    List<ParentClass> parentClassList; 

如何排序parentClassList对象与子类的Date属性?我可以使用比较器吗?在java中对收集数组列表对象的集合进行排序

我的排序要求是: 我需要在子类对象中具有earliset日期的顶部的parentClassObject元素。

例如:对象

{ 
    'parentElement1':{ 
     'childElement1':{ 
      'date' : '2013-04-05' 
         } 
        }, 
     'childElement2':{ 
      'date' : '2013-03-01' 
         } 
        } 
        }, 
'parentElement2':{ 
     'childElement1':{ 
      'date' : '2013-04-01' 
         } 
        }, 
     'childElement2':{ 
      'date' : '2013-03-04' 
         } 
        } 
    } 
+0

为什么ParentClass中不是'private Date date'呢? – 2013-04-06 00:20:48

+0

由于每个ParentClass都有多个子对象,因此您是否会根据每个ParentClass的子对集合的最早日期或最近日期比较两个ParentClass对象? – phatfingers 2013-04-06 00:39:06

我可以用比较本的JSON对象?

是的,你可以。

准确地说你如何做到这一点目前还不清楚......因为你的要求很不明确。然而,例如,根据每个人的日期第一个ChildClass实例的date来排序ParentClass个实例的列表将是简单的。

Comparator是否是正确的做法取决于上下文。正如Rajan所说:制作ParentClassComparable<ParentClass>可能会更好。

伪代码:

int compareTo(other) 
    return -1, 0 or 1 depending on whether 
     this.earliestChildDate() < other.earliestChild(), 
     this.earliestChildDate() == other.earliestChild(), or 
     this.earliestChildDate() > other.earliestChild() 

Date earliestChildDate() 
    for each childElement in this.children 
     date = smaller of date, childElement.date 
    return date 

如果缓存的最早日期孩子那么排序会更快。

请分别参阅javadocs的ComparableCollections.sort,以了解您需要分别实施和使用的API的详细信息。 (如果你不知道javadocs在哪里,谷歌“Java平台标准版7文档”并为页面添加书签。)

+0

你可以给这个伪代码吗?我怀疑我们是否可以做到这一点。 – Lokesh 2013-04-06 03:34:50

+0

@Lokesh - 除非您澄清您的要求,否则不会。 – 2013-04-06 06:16:16

+0

我编辑了我的问题以提供更多详细信息,您能否让我更深入地了解如何在父母和子女身上实施比较。 – 2013-04-06 08:01:04

我认为最好的方法是让ParentClass实现Comparable,并实现compareTo,以便它可以以所需的方式处理子类(例如,如果它是一个ChildClass,请注意date属性)。

首先,这种设计对你想达到的目标并不好。为什么父类会需要孩子类的信息?这将导致你想要实现的非常粗糙的实现。

当你说你想创建一个父类的列表并根据子类的值对它进行排序时,第一个问题是你如何创建父类对象?

如果您将其创建为:ParentClass p = new ParentClass();那么你的代码将不会工作,因为没有子类实例,因此没有日期。

所以,你所有的父类对象将被创建如下: ChildCLass c = new ChildClass(); ParentClass p =(ParentClass)p;

ParentClass p = new ChildClass();

因此,您的解决方案将始终是粗糙且不可扩展的。

我会建议改变设计。

+0

子类对象与父对象有一对多关系。 – 2013-04-06 07:48:32