如何对集合中的两个不同对象进行排序?

假设我有两个类CLassA和CLassB。 它们有一个共同点,例如每个类所持有的元素数量。

如何从ClassA和CLassB的对象创建集合并按该属性排序(按降序递增,无关紧要)?

我创建了一个类型的集合,但是当我尝试实现Comparable Interface时,我无法访问该方法(例如,返回nr元素的get)。

我有什么解决方案?

谢谢你的帮助!

实际上,ClassA和ClassB应该通过inheritance层次结构相关联,或者如果要将它们放在同一个集合中,则通过公共接口相关。

最简单的方法是使用一个公共接口,为common属性提供一个accessor方法。 然后比较器可以使用该方法(通过接口)从ClassA的实例以及ClassB的实例中获取值。

您可以使用Collections.sort(List list,Comparator c)方法创建自定义java.util.Comparator并进行排序。

嗯.. ClassA和ClassB可以共享一个接口吗?

interface InterfaceZ { int getCount(); } class ClassA implements InterfaceZ { int getCount() { return _myArray.length; } } class ClassB implements InterfaceZ { int getCount() { return _complexCollection.size(); } } 

然后只需对列表进行排序:

 List myArray; ... fill up array ... Collections.sort(myArray, new Comparator() { public int compare(InterfaceZ o1, InterfaceZ o2) { return o2.getCount() - o1.getCount(); }}); 

如果你有权访问CLassA和~B的声明,那么使用通用接口,如果没有,你可以为两个类编写一个Wrapper:

我定义 – 根据描述 – 我自己的类~A和~B,要有一些东西要测试。 想象一下,他们是外国人,你只需要访问这些课程。

 import java.util.*; public class SortAB { class CLassA { int [] elements; public CLassA (int [] a) {elements = a;} public int getElementCount () {return elements.length;} } class CLassB { List  elements; public CLassB (List  l) {elements = l;} public int getElementCount () {return elements.size ();} } /** a common element-count-wrapper with compareTo method */ abstract class EcWrapper  implements Comparable  { public abstract int getElementCount (); public int compareTo (EcWrapper o) {return getElementCount () - o.getElementCount ();} } /** concrete Wrapper for CLassA */ class EcAWrapper extends EcWrapper  { private CLassA inner; public EcAWrapper (CLassA t) { inner = t; } public int getElementCount () {return inner.getElementCount (); } } /** concrete Wrapper for CLassB */ class EcBWrapper extends EcWrapper  { private CLassB inner; public EcBWrapper (CLassB t) { inner = t; } public int getElementCount () {return inner.getElementCount (); } } // testing public SortAB () { int [] ia = {3, 5, 7, 6, 9, 11, 14}; List  il = new ArrayList  (); for (int i: ia) il.add (i); il.add (15); il.add (16); CLassA a = new CLassA (ia); CLassB b = new CLassB (il); List  list = new ArrayList  (); list.add (new EcBWrapper (b)); list.add (new EcAWrapper (a)); show (list); Collections.sort (list); show (list); } public static void main (String args[]) { new SortAB (); } public static void show (List  list) { for (EcWrapper e: list) System.out.println ("\t" + e.getElementCount ()); System.out.println ("---"); } }