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

时间:2011-05-29 23:57:40

标签: java class sorting collections comparable

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

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

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

我有什么解决方案?

感谢您的帮助!

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

嗯.. 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<InterfaceZ> myArray;

... fill up array ...

Collections.sort(myArray, new Comparator<InterfaceZ>() {
public int compare(InterfaceZ o1, InterfaceZ o2) {
    return o2.getCount() - o1.getCount();
}});

答案 3 :(得分:0)

如果您可以访问CLassA和~B的声明,那么请使用通用接口,否则您可以为两个类编写包装器:

我定义了 - 根据描述 - 我自己的类~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 <Integer> elements;
        public CLassB (List <Integer> l) {elements = l;}
        public int getElementCount () {return elements.size ();}
    }

    /** a common element-count-wrapper with compareTo method */     
    abstract class EcWrapper <T> implements Comparable <EcWrapper> {
        public abstract int getElementCount ();
        public int compareTo (EcWrapper o) {return getElementCount () - o.getElementCount ();}
    }
    /** concrete Wrapper for CLassA */
    class EcAWrapper extends EcWrapper <CLassA> {
        private CLassA inner;
        public EcAWrapper (CLassA t) {
            inner = t;
        }
        public int getElementCount () {return inner.getElementCount (); }
    }
    /** concrete Wrapper for CLassB */
    class EcBWrapper extends EcWrapper <CLassB> {
        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 <Integer> il = new ArrayList <Integer> (); 
        for (int i: ia) 
            il.add (i); 
        il.add (15);
        il.add (16);

        CLassA a = new CLassA (ia);
        CLassB b = new CLassB (il);
        List <EcWrapper> list = new ArrayList <EcWrapper> ();
        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 <EcWrapper> list)
    {
        for (EcWrapper e: list) 
            System.out.println ("\t" + e.getElementCount ());
        System.out.println ("---");
    }
}