Android排序自定义对象数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
}
}
}
}
}
错误显示在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);
}
以上是关于Android排序自定义对象数组的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段12——JavaScript的Promise对象