我一直在研究一种算法来遍历一个包含自定义对象的ArrayList。我现在在20小时,而且我几乎无处可去。
ArrayList<TicketItem> all = new ArrayList<>();
// ... 'all' gets filled here ... //
ArrayList<TicketItem> allCopy = new ArrayList<>(all);
for (int i = allCopy.size() - 1; i > 0; i--) {
TicketItem last = allCopy.get(i);
for (int j = 0; j < all.size(); j++) {
TicketItem compare = all.get(j);
if (last.getInt(TicketItem.TICKET_ITEM_ID) != compare.getInt(TicketItem.TICKET_ITEM_ID)) {
if (last.canBeGrouped(compare)) {
last.put(TicketItem.TICKET_ITEM_NUMBER, compare.getInteger(TicketItem.TICKET_ITEM_NUMBER));
allCopy.set(i, last);
break;
}
}
}
}
当它想要并且说实话时,它可能真的很难看。我无法理解更好的选择。
TicketItem中的重要方法是:
public boolean canBeGrouped(TicketItem other) {
if (other == null)
return false;
if (getBoolean(TicketItem.TICKET_ITEM_VOID))
return false;
if (other.getBoolean(TicketItem.TICKET_ITEM_VOID))
return false;
if (getInteger(TicketItem.MENU_ITEM) == null)
return false;
if (getInteger(TicketItem.MENU_ITEM).equals(other.getInteger(TicketItem.MENU_ITEM))
&& getBigDecimal(TicketItem.TICKET_ITEM_TOTAL).compareTo(
other.getBigDecimal(TicketItem.TICKET_ITEM_TOTAL)) == 0) {
ArrayList<TicketItemModifier> mThis = getModifiers();
ArrayList<TicketItemModifier> mOther = other.getModifiers();
if (mThis == null && mOther == null)
return true;
if (mThis != null && mOther != null) {
if (mThis.size() == mOther.size()) {
for (int i = 0; i < mThis.size(); i++) {
TicketItemModifier m1 = mThis.get(i);
TicketItemModifier m2 = mOther.get(i);
Integer m1MenuModifierId = m1.getInteger(TicketItemModifier.MENU_MODIFIER_ID);
Integer m2MenuModifierId = m2.getInteger(TicketItemModifier.MENU_MODIFIER_ID);
if (!(m1MenuModifierId != null && m2MenuModifierId != null && m1MenuModifierId
.equals(m2MenuModifierId))) {
return false;
}
}
return true;
}
}
}
return false;
}
再次,超级丑陋,特别是在那里工作的for循环。如果需要,我可以为TicketItem和TicketItemModifier这两个类修改hashCode和equals方法,但是我想远离这两个方法并按照可比较类的方式做一些事情,因为仅仅因为它们可以被分组并不意味着它们是相等的
我想要做的基本上是通过一个填充了TicketItem对象的ArrayList,当两个可以分组时,我需要更改TicketItem对象以匹配它。
答案 0 :(得分:2)
我建议您创建一个新的属性或函数,如TickeItemCode,它应该是MOD_SEEM +“ - ”+ TICKET_ITEM_TOTAL +“ - ”+ MOD_MODIFIER_IDs在修饰符列表中的字符串连接。您可以过滤列表以删除TICKET_ITEM_VOID为true的项目,然后按新属性TickeItemCode排序并进行分组。这样您就可以减少从n ^ 2到nlogn的时间