Как отсортировать два разных объекта в коллекции? - PullRequest
2 голосов
/ 30 мая 2011

Предположим, у меня есть два класса CLassA и CLassB. И у них есть один общий атрибут, например, количество элементов, которое содержит каждый класс.

Как мне создать коллекцию из объектов ClassA и CLassB и отсортировать по этому атрибуту (в порядке возрастания по убыванию, не имеет значения)?

Я сделал коллекцию типов, но когда я пытаюсь реализовать Comparable Interface, я не могу получить доступ к этому методу (например, get, который возвращает nr элементов).

Какие у меня есть решения?

Спасибо за вашу помощь!

Ответы [ 4 ]

5 голосов
/ 30 мая 2011

Вы можете создать собственный java.util.Comparator и отсортировать, используя Collections.sort (список списка, Comparator c) метод.

3 голосов
/ 30 мая 2011

Хм .. возможно ли для 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 голосов
/ 30 мая 2011

Действительно, ClassA и ClassB должны быть связаны либо через иерархию наследования, либо через общий интерфейс, если вы собираетесь поместить их оба в одну коллекцию.

Самое простое - иметь общий интерфейсэто обеспечивает метод доступа для общего атрибута.И тогда компаратор может использовать этот метод (через интерфейс) для извлечения значения из экземпляра ClassA, а также экземпляра ClassB.

0 голосов
/ 30 мая 2011

Если у вас есть доступ к объявлению 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 ("---");
    }
}
...