2

我有一个来自该类型的列表Superclass A,在该列表中有来自两个子类的多个对象,Subclass B并且Subclass C希望按字母顺序对它们进行排序,然后从任一子类中过滤对象,如下所示:

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());
}

在两者SuperclassSubclass?如果我不够清楚,请直说。

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

4

6 回答 6

3

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

于 2013-06-21T13:08:14.657 回答
2

我的问题是我应该如何构建我的代码。我应该在超类和子类中都实现 Comparable 吗?

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

于 2013-06-21T13:07:31.327 回答
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());
于 2013-06-21T13:18:23.547 回答
1

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

如果你想以不同的方式比较两个子类,那么你需要在你的子类中重写 compareTo() 方法。

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

于 2013-06-21T13:10:40.767 回答
1

您应该在Super Class 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();
        }
 }
于 2013-06-21T13:15:24.533 回答
0

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

于 2013-06-21T13:26:12.110 回答