0
    Class ParentClass 
    {
     private List<ChildClass>;
    }

    Class ChildClasss
    {

    private Date date;
    } 

    List<ParentClass> parentClassList;

如何使用子类的 Date 属性对 parentClassList 对象进行排序?我可以为此使用比较器吗?

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

例如:对象的 Json 表示法

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

3 回答 3

0

首先,这种设计不适合您想要实现的目标。为什么父类需要来自子类的信息?这将导致您想要实现的目标的实现非常粗糙。

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

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

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

或者

ParentClass p = new ChildClass();

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

我建议改变设计。

于 2013-04-06T03:40:40.203 回答
0

我可以为此使用比较器吗?

是的你可以。

确切地说,您将如何做到这一点尚不清楚……因为您的要求非常不清楚。但是,例如,ParentClass根据每个实例的第一个 ChildClass实例的日期对实例列表进行排序会很简单date

a 是否Comparator是正确的方法取决于上下文。ParentClass正如 Rajan 指出的那样:制作implement可能会更好Comparable<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

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

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

于 2013-04-06T00:35:50.810 回答
0

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

于 2013-04-06T00:37:01.110 回答