Android排序自定义对象数组

问题描述 投票:-1回答:2

我试图根据日期和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

android sorting arraylist
2个回答
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加速这个


0
投票

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

E.g:

if(!myUpcomingTickets.contains(t)){
                myUpcomingTickets.add(t);
}
© www.soinside.com 2019 - 2024. All rights reserved.