我正在尝试根据日期和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
答案 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);
}