比较一个ArrayList并组合常见元素

时间:2014-11-18 05:21:21

标签: java algorithm sorting arraylist matching

我一直在研究一种算法来遍历一个包含自定义对象的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对象以匹配它。

1 个答案:

答案 0 :(得分:2)

我建议您创建一个新的属性或函数,如TickeItemCode,它应该是MOD_SEEM +“ - ”+ TICKET_ITEM_TOTAL +“ - ”+ MOD_MODIFIER_IDs在修饰符列表中的字符串连接。您可以过滤列表以删除TICKET_ITEM_VOID为true的项目,然后按新属性TickeItemCode排序并进行分组。这样您就可以减少从n ^ 2到nlogn的时间