使用double for循环更改ArrayList中的变量

时间:2012-12-16 11:46:38

标签: java algorithm for-loop arraylist

我有一个名为participantUsers的ArrayList。 Person有Person.money和Person.name很有趣。

我想要做的是检查ArrayList对自己......

所以我有这个代码

    for (Person debtHaver : this.participatingUsers) {

        // If they're in debt...
        if (debtHaver.getMoney() < 0) {

            // With someone...
            for (Person personToPay : this.participatingUsers) {

                // That's not themselves...
                if (!debtHaver.getName().equals(personToPay.getName())) {
                    // See if the personToPay is ranked higher than the
                    // debtHaver...
                    if (personToPay.getMoney() > 0) {

                        // If the debtee can pay the debter in full
                        if (-debtHaver.getMoney() <= personToPay.getMoney()) {
                            payment += debtHaver.getName() + " has to pay " + personToPay.getName() + " " + -debtHaver.getMoney() + "\n";
                            debtHaver.increaseMoney(-debtHaver.getMoney());
                            personToPay.decreaseMoney(-debtHaver.getMoney());
                        }

                        if (-debtHaver.getMoney() > personToPay.getMoney())
                        {
                            //But if he can't pay in full... Just pay the small bit you can pay.
                            payment += debtHaver.getName() + " has to pay " + personToPay.getName() + " " + personToPay.getMoney() + "\n";
                            debtHaver.increaseMoney(personToPay.getMoney());
                            personToPay.decreaseMoney(personToPay.getMoney());
                        }
                    }
                }
            }
        }
    }
    return payment;

基本上,我有一个双循环,我检查每个人对自己。如果有人负债并且负债金额不足,请寻求是否有人可以支付,然后支付该人。问题是,personToPay没有在数据列表中更新debtHaver所在。我基本上编辑了两个不同的ArrayLists而不是同一个。处理这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您正在编辑同一个列表。问题可能出在这段代码中:

debtHaver.increaseMoney(-debtHaver.getMoney());
personToPay.decreaseMoney(-debtHaver.getMoney());

你将第一行的债务胡扯金额归零。然后你尝试修改personToPay零金额。只需交换两行代码就可以了:

personToPay.decreaseMoney(-debtHaver.getMoney());
debtHaver.increaseMoney(-debtHaver.getMoney());