【问题标题】:Android sorting array of custom objects自定义对象的Android排序数组
【发布时间】:2018-08-10 17:23:46
【问题描述】:

我正在尝试根据日期和Class 将 Ticket 对象的静态数组排序为两个不同的数组。这两个数组将用作填充两个不同list 视图的数据。我只想为每个Class 对象添加一张票到每个array。我收到了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


【解决方案1】:

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

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

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

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

我的建议是 1) 扩展您的对象哈希和等于以使您的对象更易于使用

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

【讨论】:

    【解决方案2】:

    您正在修改列表(myUpcomingTickets、myPastTickets),同时迭代它们!
    你可以做什么:
    1.如果还没有实现,实现Ticket对象的equals和hashcode
    2. 使用 list.contains(Obj) 而不是使用 for 循环

    例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      相关资源
      最近更新 更多