Android排序自定义对象数组

时间:2018-03-02 13:27:40

标签: android sorting arraylist

我正在尝试根据日期和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

2 个答案:

答案 0 :(得分:1)

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

引起的
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来加快速度

答案 1 :(得分:0)

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

E.g:

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