我有Superclass A
类型的列表,在该列表中有两个子类Subclass B
和Subclass 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} Superclass
和Subclass
中的?如果我不够清楚,请说出来。
编辑:由于我在其中一个已从超类继承的子类中留下的方法,我收到错误,我认为该错误与Comparable<A>
的结构有关,因为我不确定它是否正确,但我已经有了你们所有人告诉我的代码,但无论如何都要感谢。
答案 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。因为一旦你实现了子类,你也可以在超类中使用该方法比较实例。 所以我的建议是在超类上实现可比性。