【问题标题】:To sort the collection of collection array list object in java在java中对集合数组列表对象的集合进行排序
【发布时间】:2013-04-06 00:17:12
【问题描述】:
    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'
                        }
                     }
    }

【问题讨论】:

  • 为什么 private Date date 不在 ParentClass 中呢?
  • 由于每个 ParentClass 都有多个孩子,您是否会根据每个 ParentClass 的孩子集合的最早日期或最晚日期来比较两个 ParentClass 对象?

标签: java sorting arraylist


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    父类 p = new ChildClass();

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

    我建议改变设计。

    【讨论】:

    • 子类对象与父类是一对多关系。
    【解决方案3】:

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

    是的,你可以。

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

    Comparator 是否是正确的方法取决于上下文。正如 Rajan 所说:让 ParentClass 实现 Comparable&lt;ParentClass&gt; 可能会更好。

    伪代码:

    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
    

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

    请参阅ComparableCollections.sort 的javadocs,了解您需要分别实现和使用的API 的详细信息。 (如果您不知道 javadocs 的位置,请在 Google 上搜索“Java Platform Standard Edition 7 文档”并将页面添加为书签。)

    【讨论】:

    • 你能给出一个伪代码吗?我怀疑我们是否能做到这一点。
    • @Lokesh - 除非你明确你的要求。
    • 我已经编辑了我的问题以提供更多详细信息,您能否让我更深入地了解如何在父母和孩子身上实施比较器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多