Сортировка объектов разных типов в один список

У меня следующая проблема, и я не совсем уверен, как ее решить. Я запрашиваю данные с нескольких разных серверов, при этом каждый сервер возвращает список объектов другого типа (каждый сервер имеет свой собственный уникальный тип объекта POJO), но что общего у всех этих списков объектов, так это то, что все объекты имеют параметр даты. Затем мне нужно отобразить объекты из всех списков как один огромный смешанный список для пользователя со всеми различными объектами, отсортированными по дате.

Я сделал адаптер, который расширяет baseadapter, и я передал этому адаптеру все массивы объектов, но как я могу отсортировать все эти списки объектов по дате и отобразить их все вместе? Я мог бы создать «суперобъект», обладающий свойствами всех других объектов, а затем сделать один отсортированный массив этого суперобъекта для передачи адаптеру, но это кажется запутанным и грубым решением. Есть ли более или менее элегантный способ сделать это?

public class someAdapter extends BaseAdapter
{
...

public someAdapter(ArrayList<ObjectOne> objectOneArray, ArrayList<ObjectTwo> objectTwoArray) {
        if (objectOneArray != null) {
            this.localObjectOneList.addAll(objectOneArray);
        }
        ...
}
}

Пример типа объекта:

public class ObjectOne implements Serializable {
private String date;
private String someFieldOne;
private String someFieldTwo;

...
//getters and setters
...
}

Повторюсь: окончательный список должен представлять собой смесь всех различных типов объектов в порядке их дат.


person Jon    schedule 23.09.2015    source источник
comment
Вы должны принять ответ, который решает вашу проблему.   -  person App Work    schedule 23.09.2015


Ответы (4)


То, как вы изначально ожидали иметь суперкласс, было бы неплохо, если бы не было огромной связанной сантехники. Лучший подход может быть следующим: Предположим, что все POJO имеют метод getDate().

  1. Объявите метод getDate() для получения объекта даты из любого POJO.
  2. Объявить Comparator для сравнения дат
  3. Сортировать объекты

    Если у POJO нет геттеров, то есть метода getDate(), замените getDateFromMethod() на getDateFromProperty() в comparator .

    public class Sorter{ public void sortList()
    {
        Collections.sort(objList, comparator);
    
        // Now consume / print your objList to get sorted by date
    }
    
    ArrayList<Object>   objList     = new ArrayList<Object>();
    
    Comparator<Object>  comparator  = new Comparator<Object>()
                                    {
    
    
    
                                    @Override
                                    public int compare(Object object1, Object o2)
                                        {
                                            Date o1Date = getDateFromMethod(object1);
                                            Date o2Date = getDateFromMethod(o2);
                                            if (o1Date != null && o2Date != null)
                                            {
                                                if (o1Date.before(o2Date))
                                                    return -1;
                                                else if (o1Date.after(o2Date))
                                                    return 1;
    
                                                else
                                                    return 0;
                                            }
                                            else
                                                return -1;
                                        }
                                    };
    
    public Date getDateFromMethod(Object obj)
    {
    
        Date date = null;
        String getDate = "getDate";
        try
        {
            Method method = obj.getClass().getMethod(getDate, (Class<?>[]) null);
            if (method != null)
                date = (Date) method.invoke(obj, (Object[]) null);
        }
        catch (NoSuchMethodException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (SecurityException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IllegalArgumentException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (InvocationTargetException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        return date;
    }public Date getDateFromProperty(Object obj)
                                {
                                    Date date=null;
                                    try
                                    {
                                    Field dateField=    obj.getClass().getField("date");
                                    if(dateField!=null)
                                        date=(Date) dateField.get(obj);
                                    }
                                    catch (NoSuchFieldException e)
                                    {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    catch (SecurityException e)
                                    {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    catch (IllegalArgumentException e)
                                    {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    catch (IllegalAccessException e)
                                    {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
    
                                    return date;
    
                                }
    

    }

    Теперь скажем, например, у вас есть Obj1, Obj2 и Obj3 следующим образом, создайте объекты, используя эти POJOS, заполните objList и протестируйте решение.

класс Obj1 { int id; внутреннее имя; Дата Дата;

public Date getDate()

{ Дата возврата; } public int getId() { идентификатор возврата; }

public void setId(int id)
{
    this.id = id;
}

public int getName()
{
    return name;
}

public void setName(int name)
{
    this.name = name;
}

}

класс Obj2 {целая последовательность; внутреннее местоположение; Дата Дата;

public Date getDate()

{ Дата возврата; } public int getSequence() { возвращаемая последовательность; }

public void setSequence(int sequence)
{
    this.sequence = sequence;
}

public int getLocation()
{
    return location;
}

public void setLocation(int location)
{
    this.location = location;
}

}

класс Obj3 { тип int; внутреннее происхождение; Дата Дата;

public Date getDate()

{ Дата возврата; }

public void setDate (дата даты) { this.date = date; }

public int getType()
{
    return type;
}

public void setType(int type)
{
    this.type = type;
}

public int getOrigin()
{
    return origin;
}

public void setOrigin(int origin)
{
    this.origin = origin;
}

}

person App Work    schedule 23.09.2015

Вы можете создать свой собственный интерфейс с помощью метода getDate()

interface PojoInterface {
    ...
    Date getDate();
}

каждый POJO должен реализовать этот интерфейс

то вы должны создать свой собственный класс Comparator

class CustomComparator implements Comparator<PojoInterface> {

    @Override
    public int compare(PojoInterface a, PojoInterface t1) {
        return a.getDate().compareTo(t1.getDate());
    }

    ...
}

а затем отсортировать один общий список

public someAdapter(ArrayList<A> objectOneArray, ArrayList<A> objectTwoArray) {
    this.localObjectsList.addAll(objectOneArray);
    this.localObjectsList.addAll(objectTwoArray);
    Collections.sort(this.localObjectsList, new CustomComparator());
    ...
}
person Vasyl Glodan    schedule 23.09.2015
comment
Потрясающий! Это лучший способ, который я нашел среди других сообщений. - person Abhay Koradiya; 21.11.2019

Просто используйте список типов объектов для хранения любого типа ссылки

List<Object> localObjectOneList= new ArrayList <Object>();

person Rajan Kali    schedule 23.09.2015

Если вы можете изменить определение класса объектов, я предлагаю вам позволить им реализовать Comparable, а затем переопределить метод compareTo(), а затем, наконец, использовать Arrays.sort() для сортировки списка.

person Joel Min    schedule 23.09.2015