Формула, чтобы разделить цену поровну среди людей - PullRequest
0 голосов
/ 13 декабря 2018

Около 3 дней я пытаюсь найти общую формулу для разделения платежей между людьми.Пока что в Java я делаю что-то вроде этого:

NameArray [Me, Dad, Mum, Sister]

singlePayment[10,5,15,20,2,4]

totalPaymentperPerson[25, 20, 6, 15]

Затем я приказываю по самой высокой цене totalPaymentperPerson --> [25,20,15,6]

Таким образом, имя Array стало [Me, Dad, Sister, Mum]

(Вся цена и имя добавляются пользователем динамически)

Итак, общая стоимость: 66

Цена на человека: 16.5 --> 66/4

debtorArray [Sister, mum] --> the pay 15 and 6, under the cost per person of 16.5

receiverArray[Me, Dad] --> [20.5, 3,5]

differenceArray[1.5, 10.5] ---> cpp - debtorArray

Теперь я должен сделать что-то вроде этого:

  • Мама должна мне 8,5
  • Мама должна папе 6,5
  • Сестра должна папе 1,5

Я не могу понять, как этого добиться ... Если я делаю формулу для 3 участников, то, если у меня есть 6 участников, формула больше не работает .. или, может быть, она будет работать, если яесть 3 платежа, но не с 5.. Есть ли способ сделать это с помощью логики?У меня слишком много "если-еще" в моем коде ...

1 Ответ

0 голосов
/ 13 декабря 2018

Учитывая ниже ввод данные / аналогичные [Примечание: я немного изменил ваш ввод]:

Me = 25
Dad = 20
Mum = 6
Sister = 15

Ниже приведен код Java для равномерного распределения суммы между собой:

package com.shree.algo;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class EvenDistribution {

    private ConcurrentHashMap<String,Double> initialPayment = new ConcurrentHashMap<>();

    private ConcurrentHashMap<String,Double> computations;


    public EvenDistribution(Map<String,Double> initialPayment){
        this.initialPayment.putAll(initialPayment);
        computations = new ConcurrentHashMap<>();
        subtract();
    }


    private double getAmoutToDistribute(){

        double totalAmount = 0;

        for(double credit: initialPayment.values()){
            totalAmount = totalAmount + credit;
        }

        double amountToDistribute = (totalAmount/initialPayment.size()); 

        return amountToDistribute;
    }

    public void subtract(){

        double amountToDistribute = getAmoutToDistribute();

        for(String name: initialPayment.keySet()){
            double remainingAmount =  initialPayment.get(name) - amountToDistribute ;
            computations.put(name, remainingAmount);
        }
    }

    public void calculate(){

        for(String name: computations.keySet()){
            Double p1amount = computations.get(name);

            if(p1amount>0){
                for(String tmpName: computations.keySet()){
                    double p2amount = computations.get(tmpName);

                    if(!tmpName.equals(name) && p2amount<0){
                            double result = p1amount + p2amount;
                            computations.put(name, 0D);
                            computations.put(tmpName, result);

                            System.out.println(name + "=>" + p1amount + "=>" + tmpName);

                            break;
                    }
                }
            }

        }


        for(String name: computations.keySet()){
            if(computations.get(name)!=0){
                calculate();
            }
        }

    }

}

Основной класс:

package com.shree.algo;

import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        Map<String,Double> initialPayment = new HashMap<>();

        initialPayment.put("Me", 25D);
        initialPayment.put("Dad", 20D);
        initialPayment.put("Mum", 6D);
        initialPayment.put("Sister", 15D);

        EvenDistribution evenDistribution= new EvenDistribution(initialPayment);

        evenDistribution.calculate();
    }
}

Выход:

Dad=>3.5=>Mum
Me=>8.5=>Mum
Mum=>1.5=>Sister
...