【问题标题】:Sorting objects of different types into one list将不同类型的对象排序到一个列表中
【发布时间】:2015-09-23 12:15:32
【问题描述】:

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

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

【问题讨论】:

  • 你应该接受能解决你问题的答案。

标签: java android sorting pojo


【解决方案1】:

如果没有相关的大型管道,您最初期望拥有一个超类的方式会很好。 更好的方法如下:假设所有 POJO 都有 getDate() 方法。

  1. 声明一个 getDate() 方法以从任何 POJO 中检索日期对象。
  2. 声明 Comparator 以比较日期
  3. 对对象进行排序

    如果 POJO 没有 getter,即 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 并测试解决方案。

类 Obj1 { 内部标识; 整数名称; 日期日期;

public Date getDate()

{ 归期; } 公共 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()

{ 归期; } 公共 int getSequence() { 返回序列; }

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

public int getLocation()
{
    return location;
}

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

}

类 Obj3 { 整数类型; 诠释原产地; 日期日期;

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;
}

}

【讨论】:

    【解决方案2】:

    您可以使用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());
        ...
    }
    

    【讨论】:

    • 太棒了!这是我在其他帖子中找到的最佳方式。
    【解决方案3】:

    只需使用对象类型列表来保存任何引用类型

    List&lt;Object&gt; localObjectOneList= new ArrayList &lt;Object&gt;();

    【讨论】:

      【解决方案4】:

      如果你能够改变对象的类定义,我建议你让它们实现Comparable,然后重写compareTo()方法,最后使用Arrays.sort()对列表进行排序

      【讨论】:

        猜你喜欢
        • 2020-11-06
        • 2012-11-23
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        • 2013-11-13
        • 2019-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多