我有以下问题,但我不确定如何解决.我从几个不同的服务器请求数据,每个服务器返回一个不同类型的对象列表(每个服务器都有它自己特定的唯一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;}
}
总结以上是内存溢出为你收集整理的java-将不同类型的对象排序到一个列表中全部内容,希望文章能够帮你解决java-将不同类型的对象排序到一个列表中所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)