Android排序自定义对象数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android排序自定义对象数组相关的知识,希望对你有一定的参考价值。

我试图根据日期和Class将Ticket对象的静态数组排序为两个不同的数组。这两个数组将用作填充两个不同list视图的数据。我只想为每个Class每个array对象添加一个Ticket。我得到了一个error

    ArrayList<Ticket> myUpcomingTickets = new ArrayList<>();
    ArrayList<Ticket> myPastTickets = new ArrayList<>();

    for (Ticket t : Ticket.getTickets()) {
        if (t.getClass().getDate().after(date)) {
            if(myUpcomingTickets.isEmpty()){
                myUpcomingTickets.add(t);
            }else {
                for(Ticket t1: myUpcomingTickets) {
                    if (!t.getClass().getId().equals(t1.getClass().getId())) {
                        myUpcomingTickets.add(t);
                    }
                }
            }
        } else {
            if(myPastTickets.isEmpty()){
                myPastTickets.add(t);
            } else {
                for(Ticket t2: myPastTickets) {
                    if (!t.getClass().getId().equals(t2.getClass().getId())) { //Add if not already there
                        myPastTickets.add(t);
                    }
                }
            }
        }
    }

错误显示在Logcat java.util.ConcurrentModificationException

答案

这有一些问题。错误是由此引起的

for(Ticket t2: myPastTickets) {
                    if (!t.getClass().getId().equals(t2.getClass().getId())) { //Add if not already there
                        myPastTickets.add(t);
                    }
                }

您不能在当前正在循环的列表中添加或删除。

此外,由于您拥有嵌套循环,此方法会非常慢。

我的建议是1)扩展你的对象hash和equals以使你的对象更容易使用

public class Ticket {
 @Override
    public int hashCode() {
        return getId().hashCode();
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final Ticket other = (Ticket ) obj;
        return other.getId() == this.getId();
    }
}

然后你可以这样做:

ArrayList<Ticket> myUpcomingTickets = new ArrayList<>();
    ArrayList<Ticket> myPastTickets = new ArrayList<>();

    for (Ticket t : Ticket.getTickets()) {
        if (t.getClass().getDate().after(date)) {
            if(!myUpcomingTickets.contains(t)){
                myUpcomingTickets.add(t);
            }
        } else {
            if(!myPastTickets.contains(t)){
                myPastTickets.add(t);
            }
        }
    }

如果你不需要列表在一个顺序我建议使用hashmap而不是arraylist加速这个

另一答案

您正在迭代它们时修改列表(myUpcomingTickets,myPastTickets)! 你能做什么: 1.如果尚未实现,请为Ticket对象实现equals和hashcode 2.使用list.contains(Obj)而不是使用for循环

E.g:

if(!myUpcomingTickets.contains(t)){
                myUpcomingTickets.add(t);
}

以上是关于Android排序自定义对象数组的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段—— 数组的响应式方法

VSCode自定义代码片段10—— 数组的响应式方法

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段——JS中的面向对象编程

【JS】数组对象自定义排序