将不同类型的对象分类到一个列表中
Sorting objects of different types into one list
我遇到了以下问题,我不太确定如何解决它。我从几个不同的服务器请求数据,每个服务器返回一个不同类型的对象列表(每个服务器都有它自己特定的唯一 POJO 对象类型)——但是所有这些对象列表的共同点是所有对象都有一个日期参数。然后我需要将所有列表中的对象显示为一个巨大的混合列表供用户使用,所有各种对象都按日期排序。
我制作了一个扩展 baseadapter 的适配器,并且我已将所有对象数组列表传递给该适配器 - 但我如何才能按日期对所有这些对象列表进行排序并将它们全部显示在一起?我可以创建一个 "super object",它具有所有其他对象的属性,然后为这个超级对象创建一个排序数组以传递给适配器,但这似乎是一个混乱而粗糙的解决方案。有没有更优雅的方法来做到这一点?
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
...
}
重申一下 - 最终列表必须按日期顺序混合所有不同对象类型。
只需使用对象类型列表来保存任何引用类型
List<Object> localObjectOneList= new ArrayList <Object>();
如果你能改变对象的class定义,我建议你让他们实现Comparable,然后覆盖compareTo()
方法,最后使用Arrays.sort( ) 对列表进行排序
您可以使用方法 getDate()
创建您自己的界面
interface PojoInterface {
...
Date getDate();
}
每个 POJO 都应该实现这个接口
然后你应该创建你的自定义比较器class
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());
...
}
如果没有相关的大型管道,您最初期望拥有超级 class 的方式会很好。
更好的方法如下:假设所有的 POJO 都有 getDate() 方法。
- 声明一个方法 getDate() 以从任何 POJO 检索日期对象。
- 声明一个
Comparator
来比较日期
对对象进行排序
如果 POJO 没有吸气剂,即 getDate()
方法,请在 comparator
中将 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 并测试解决方案。
class 对象 1
{
内部编号;
整数名称;
日期日期;
public Date getDate()
{
return日期;
}
public int getId()
{
return 编号;
}
public void setId(int id)
{
this.id = id;
}
public int getName()
{
return name;
}
public void setName(int name)
{
this.name = name;
}
}
class 对象 2
{
整数序列;
内部位置;
日期日期;
public Date getDate()
{
return日期;
}
public int getSequence()
{
return序列;
}
public void setSequence(int sequence)
{
this.sequence = sequence;
}
public int getLocation()
{
return location;
}
public void setLocation(int location)
{
this.location = location;
}
}
class 对象 3
{
整数类型;
内部来源;
日期日期;
public Date getDate()
{
return日期;
}
public void setDate(Date 日期)
{
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;
}
}
我遇到了以下问题,我不太确定如何解决它。我从几个不同的服务器请求数据,每个服务器返回一个不同类型的对象列表(每个服务器都有它自己特定的唯一 POJO 对象类型)——但是所有这些对象列表的共同点是所有对象都有一个日期参数。然后我需要将所有列表中的对象显示为一个巨大的混合列表供用户使用,所有各种对象都按日期排序。
我制作了一个扩展 baseadapter 的适配器,并且我已将所有对象数组列表传递给该适配器 - 但我如何才能按日期对所有这些对象列表进行排序并将它们全部显示在一起?我可以创建一个 "super object",它具有所有其他对象的属性,然后为这个超级对象创建一个排序数组以传递给适配器,但这似乎是一个混乱而粗糙的解决方案。有没有更优雅的方法来做到这一点?
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
...
}
重申一下 - 最终列表必须按日期顺序混合所有不同对象类型。
只需使用对象类型列表来保存任何引用类型
List<Object> localObjectOneList= new ArrayList <Object>();
如果你能改变对象的class定义,我建议你让他们实现Comparable,然后覆盖compareTo()
方法,最后使用Arrays.sort( ) 对列表进行排序
您可以使用方法 getDate()
interface PojoInterface {
...
Date getDate();
}
每个 POJO 都应该实现这个接口
然后你应该创建你的自定义比较器class
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());
...
}
如果没有相关的大型管道,您最初期望拥有超级 class 的方式会很好。 更好的方法如下:假设所有的 POJO 都有 getDate() 方法。
- 声明一个方法 getDate() 以从任何 POJO 检索日期对象。
- 声明一个
Comparator
来比较日期 对对象进行排序
如果 POJO 没有吸气剂,即
getDate()
方法,请在comparator
中将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 并测试解决方案。
class 对象 1 { 内部编号; 整数名称; 日期日期;
public Date getDate()
{ return日期; } public int getId() { return 编号; }
public void setId(int id)
{
this.id = id;
}
public int getName()
{
return name;
}
public void setName(int name)
{
this.name = name;
}
}
class 对象 2 { 整数序列; 内部位置; 日期日期;
public Date getDate()
{ return日期; } public int getSequence() { return序列; }
public void setSequence(int sequence)
{
this.sequence = sequence;
}
public int getLocation()
{
return location;
}
public void setLocation(int location)
{
this.location = location;
}
}
class 对象 3 { 整数类型; 内部来源; 日期日期;
public Date getDate()
{ return日期; }
public void setDate(Date 日期) { 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;
}
}