Android排序自定义对象数组

农村四月闲人少,勤学苦攻把名扬。这篇文章主要讲述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); } } } } }

【Android排序自定义对象数组】错误显示在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); }


    推荐阅读