2012-12-16 2 views
1

participatingUsers라는 ArrayList가 있습니다. Person에는 흥미로운 Person.money와 Person.name이 있습니다.double for 루프를 사용하여 ArrayList 내의 변수를 변경하십시오.

내가하고 싶은 것은 그 자체에 대해 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가 arrayList debtHaver에서 업데이트되지 않는다는 것입니다. 기본적으로 동일한 ArrayLists 대신 두 개의 다른 ArrayLists를 편집합니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

+2

왜 'personToPay는 ArrayList를 debtHaver 업데이트되지 않는 *는 *에'? 목록은 확실히 복사되지 않으며 개체는 참조가 아닌 복사본으로 저장됩니다. 오류나 바람직하지 않은 동작이 있습니까? – Veger

+0

또한, 수표에 돈을 내야하는지 여부에 오류가 있다고 생각합니다. 두 개의 if 문이 서로 반대되는 관계로, 두 사람이 모두 빚을 지거나 둘 다 지불하지 않는 경우에도 항상 누군가가 지불합니다. – Veger

답변

2

같은 목록을 편집하고 있습니다. 문제는이 코드에 아마도 :

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

당신은 첫 번째 라인으로 제로로 debtHaver의 양을두고있다. 그런 다음 personToPay를 0으로 수정하려고합니다. 그냥 두 줄의 코드를 교환하고 그것을 작동합니다 :

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

놀라운. 내가 어떻게 어리석은 짓일 수 있니? – user1810737

관련 문제