java-将不同类型的对象排序到一个列表中

我有以下问题,但我不确定如何解决.我从几个不同的服务器请求数据,每个服务器返回一个不同类型的对象列表(每个服务器都有它自己特定的唯一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
...
}

重申一下-最终列表必须按照日期的顺序混合所有不同的对象类型.

解决方法:

如果没有庞大的管道,您最初期望的拥有超类的方式会很好.
更好的方法如下:假定所有POJO都有getDate()方法.

>声明方法getDate()从任何POJO中检索日期对象.
>声明比较器以比较日期
>排序对象

如果POJO没有吸气剂,即getDate()方法,则在比较器中将getDateFromMethod()替换为getDateFromProperty().

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;
    整数名称
    日期date;

public Date getDate()

{
    归期;
}
    公共诠释getId()
    {
        返回ID;
    }

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

public int getName()
{
    return name;
}

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

}

Obj2类
{
    整数序列;
    int位置;
    日期date;

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来源;
日期date;

public Date getDate()

{
    归期;
}

public void setDate(日期)
{
    this.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;
}

}

上一篇:第一次写入关闭的连接时,为什么TcpClient.Write不会引发异常?


下一篇:java mybatis(补充2)