2012-12-16 2 views
1

Je dispose d'un participatingUsers appelé ArrayList. Personne a Person.money et Person.name qui sont intéressants.variables à l'intérieur ArrayList avec Modification des double pour boucle

Ce que je veux faire est de vérifier la ArrayList contre lui-même ...

J'ai donc ce code

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; 

Fondamentalement, j'ai une double boucle où je vérifie chaque personne contre elle-même. Si quelqu'un est endetté et a une somme d'argent négative, cherchez s'il y a quelqu'un qu'il peut payer, puis payez cette personne. La chose est, personToPay est pas mis à jour dans le arrayList debtHaver est. Je suis d'édition essentiellement deux ArrayLists différents au lieu de la même. Quelle est la meilleure façon de gérer ce problème?

+2

'* personToPay n'est pas mis à jour dans le arrayList debtHaver est dans *' Pourquoi pas? Il devrait être, les listes ne sont certainement pas copiées et les objets sont stockés par référence (pas par copie). Avez-vous une erreur ou un comportement indésirable? – Veger

+0

De plus, je pense que vous avez une erreur dans votre vérifie si on doit payer. Les deux déclarations sont si-leur face, donc il y a toujours quelqu'un payer même si les deux personnes sont endettés ou les deux ne sont pas ... – Veger

Répondre

2

Vous modifiez la même liste. Le problème est probablement dans ce code:

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

Vous mettez le montant de debtHaver à zéro par la première ligne. Et puis vous essayez de modifier personToPay avec un montant nul. Il suffit d'échanger deux lignes de code et cela devrait fonctionner:

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

incroyable. Comment pourrais-je être si stupide ... – user1810737

Questions connexes