排序作为抽象类子类实例的对象的ArrayList

时间:2017-05-21 16:00:04

标签: java sorting arraylist comparator comparable

这是我的主要结构: 一些接口方法在A类中实现,其余的都在子类中实现。

public interface I
{
// some methods
//
}
public abstract class A implements I
{
// some variables and methods
//
}
public class B extends A
{
// some variables and methods
//
}
public class C extends A
{
// some variables and methods
//
}
public abstract class D extends A
{
// some variables and methods
//
}
public class E extends D
{
// some variables and methods
//
}
public class Test
{
 public static void main(String[] args) 
 {
  ArrayList<I> la = new ArrayList<I>();
  la.add(new B(..));
  la.add(new C(..));
  la.add(new C(..));
  la.add(new B(..));
  la.add(new E(..));
 }
}

B,C和E类中有构造函数。

我需要按类A的变量对la进行排序,变量是int数据类型。

我尝试改为

public abstract class A implements I, Comparable<A>

但由于在所有非抽象类中缺少public int compareTo(A o)方法,我收到错误。

我需要做什么?

感谢。

2 个答案:

答案 0 :(得分:0)

public abstract class A implements I, Comparable<A> {
    // some variables and methods

    @Override
    public int compareTo(A o) {
        return someVariable - o.someVariable;
    }
}

您不需要A中的构造函数来实现compareTo方法,并且您可以使用一些变量来进行比较。 compareTo只是一种方法,因此您可以在A中使用方法,也可以使用compareTo方法。由于我不知道你有什么可用的变量,也不知道你需要的排序顺序,你必须自己填写这个方法。

另一方面,在A中使用构造函数可能是一个好主意,但这是一个完全独立的问题。

编辑:我起初并没有想到这一点:你当然想要做

    Collections.sort(la);

这并不像听起来那么简单。 Collections.sort()是根据the docs声明的通用方法:

static <T extends Comparable<? super T>> void sort(List<T> list)

这意味着编译器对方法的调用感到高兴,列表的声明元素类型必须是对某些类型Comparable<U>实现U的元素类型,它是元素类型或者它的超类型。您的元素类型为I,而I未实现Comparable。这就是您收到错误消息的原因。

解决方案?我不认为存在完美的解决方案。假设您不想声明la ArrayList<A>,另一个选项是声明I具有可比性:

public interface I extends Comparable<I>

严格来说,这比我们能够实现的A更有希望。我们可以比较两个A对象(即使它们是A的子类的实例),但可能还有I的其他实现,我们可能不知道如何将它们与{ {1}}。一个出路是:

A

由于@Override public int compareTo(I o) { A oa = (A) o; // will throw ClassCastException if o is not an A return someVariable - oa.someVariable; } 延伸AI延伸I,我们现在必须声明Comparable<I> o,而不是{{1} }}。如果有人给我们一些外来I实现,我们抛出一个A,排序会将它传播给调用者。但是,我们知道在列表中所有元素都是I的子类的实例,所以这不会发生。完成上述操作后,您对ClassCastException的通话和对A的通话都将有效。

答案 1 :(得分:0)

我通过添加来解决它 public interface I extends Comparable<I> 在A类中,我将方法compareTo更改为

public int compareTo(I obj)
{
    return someVariable - obj.someVariable;
}