从两个子类中对超类对象列表进行排序

时间:2013-06-21 13:03:16

标签: java inheritance subclass superclass

我有Superclass A类型的列表,在该列表中有两个子类Subclass BSubclass C的多个对象,并希望按字母顺序对它们进行排序,然后从要么是Subclass,就像这样:

List <A> listA= new ArrayList<A>();

Collections.sort(listA);
    for (A iterator : listA)
        if (iterator instanceof B)
            System.out.println(iterator);

我的问题是我应该如何构建我的代码。我应该实施Comparable <A>

public int compareTo(A a) {
    return name.compareTo(a.getName());
}
{p} SuperclassSubclass中的

?如果我不够清楚,请说出来。

编辑:由于我在其中一个已从超类继承的子类中留下的方法,我收到错误,我认为该错误与Comparable<A>的结构有关,因为我不确定它是否正确,但我已经有了你们所有人告诉我的代码,但无论如何都要感谢。

6 个答案:

答案 0 :(得分:3)

如果您可以比较SuperclassA的实例,无论它们是SubclassB还是SubclassC,那么仅在超类中使用Comparable<SuperclassA>的解决方案就非常有意义。如果实现需要了解特定于子类的数据,请添加将此数据提供给SuperclassA的抽象方法,并在比较器中调用它们。

答案 1 :(得分:2)

  

我的问题是我应该如何构建我的代码。我应该在Superclass和Subclass中实现Comparable吗?

不,如果你在超类A中实现它就足够了。该方法将由子类继承。

答案 2 :(得分:2)

我建议您实施Comparator

public NameAndClassComparator implements Comparator<A> {
    public int compare(A left, a right) {
        if(left == null && right == null) {
            return 0;
        }
        if(left == null) {
            return -1;
        }
        if(right == null) {
            return 1;
        }

        int retVal = left.getname().compareTo(right.getName());

        if(retVal == 0) {
            retVal = left.getClass().getName().compareTo(right.getClass().getName());
        }

        return retVal;
    }
}

然后使用此比较器来比较您的对象:

Collections.sort(listA, new NameAndClassComparator());

答案 3 :(得分:1)

您只需要在超类上实现Comparable。一旦实现,子类将在超类中使用相同的方法来比较实例。

如果要以不同方式比较两个子类,则需要覆盖子类中的compareTo()方法。

即使在这种情况下,您仍然需要在超类上实现Comparable。

答案 4 :(得分:1)

你应该在超级A 中实现 Comparable

Class A implements Comparable<A>{
    .....
    .....

    public int compareTo(Object obj){
       if( null != obj && (obj instanceOf A || obj instanceOf B || obj instanceOf C)){
         //Compare your properties here and return -1, 0 or 1 depending on the result of comparision.
        }else{
           throw new IlligalArgumentException();
        }
 }

答案 5 :(得分:0)

你只需要在超类上实现Comparable。因为一旦你实现了子类,你也可以在超类中使用该方法比较实例。 所以我的建议是在超类上实现可比性。