Preciso realizar uma divisão de valores e pegar o resto para distribuir entre os clientes de uma lista enquanto existir esse resto, para que não sobre nenhum valor e a divisão seja inteira.
Ex: São três clientes e o total foi quatro para dividir entre eles, então fica assim:
1º Cliente: 2 reais
2º Cliente: 1 real
3º Cliente: 1 real
Eu peguei esse resto e tentei fazer um while com ele, mas acaba distribuindo o valor para todos os Clientes e todo mundo fica com 2 reais.
Nesse trecho do código eu crio um ArrayList para receber a lista em txt com nome dos clientes, crio um try catch para receber o arquivo e percorro a lista toda calculando o tamanho da lista (quantidade de clientes) para dividir com o valor total da lista de compras que foi previamente adicionada e somada os valores. (Todos os valores precisam ser inteiros) No final, preciso exibir um map com o nome do cliente e o valor que ele está devendo.
List<String> clienteList = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader("listadeClientes.txt"))) {
String linhaCliente;
while ((linhaCl = br.readLine()) != null) {
clienteList.add(linhaCl);
}
for (String cliente : clienteList) {
// Tamanho da lista de e-mails
int tamLista = clienteList.size();
// Divisão do valor da lista com a quantidade de e-mails
// (var subtotal provém de outro trecho que soma o valor total da lista de compras)
int total = (subtotal / tamLista) / 100;
// captura o resto da divisão
int restoTotal = subtotal%tamLista;
while (restoTotal > 0) { **// Condicional para tratar o resto**
total++; **// Adicionar 1 à variável**
restoTotal--; **// Diminuir 1 do resto**
}
// Criação do Map
Map<String, Integer> clienteMap = new HashMap<>();
clienteMap.put(cliente, total);
// Exibição dos dados com forEach utilizado em Java 8
clienteMap.forEach((clienteChave, totalValor) ->
System.out.println("A pessoa: " + clienteChave + " está devendo " + totalValor + " reais.")
);
}
} catch (IOException e) {
System.out.println("Erro com o arquivo! Por favor, escolha um arquivo diferente.");
}
Dessa forma ele não está exibindo o primeiro como 2 e os outros como 1, todos estão sendo incrementados, talvez eu tenha perdido algo.
E se fosse 5 reais pra dividir em 3 pessoas, como ficaria?
O primeiro com 3 reais e os demais com 1
O primeiro e segundo com 2 reais e o terceiro com 1
De qualquer forma não entendi porque criar o map dentro do for, pois assim vc cria um novo map a cada iteração. Se a ideia é criar apenas um com todos os clientes, crie-o fora do loop.
E independente da solução, eu acho - se entendi direito - que é mais simples. Primeiro todos recebem o valor total dividido pela quantidade, e depois vc distribui o resto.
Map<String, Integer> clienteMap = new HashMap<>();
int valor = subtotal / clienteList.size();
int resto = subtotal % clienteList.size();
// opção 1, o primeiro recebe todo o resto
for (String cliente : clienteList) {
clienteMap.put(cliente, valor);
}
clienteMap.put(clienteList.get(0), valor + resto);
// opção 2, distribui o resto entre os primeiros
for (String cliente : clienteList) {
if (resto > 0) {
clienteMap.put(cliente, valor + 1 );
resto--;
} else clienteMap.put(cliente, valor);
}
Seria a opção 2 mesmo ( 1. O primeiro e segundo com 2 reais e o terceiro com 1).
Seria um Map dentro do for para exibir todos os clientes e valores em cada linha.
Eu tentei fazer desta forma e não funcionou, porque agora vi que o resto está dando 0 sempre, não sei o que pode ser, estava funcionando antes.
*** Na verdade, agora ele está adicionando 1 a todos os clientes.
Consegui realizar o resto, eu estava com problemas na ordem dos códigos, tirei as variáveis do for e funcionou, muito obrigada, Hugo. Agora só queria tirar mais uma dúvida, sobre validação. Estou tentando excluir do meu ArrayList quando o e-mail (será a chave do Cliente no Map de exibição posteriormente) inserido estiver inválido, mas dá erro.
List<String> clienteList = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader("listadeClientes.txt"))) {
String linhaCliente;
while ((linhaCl = br.readLine()) != null) {
clienteList.add(linhaCl);
}
//validar e-mail inserido pelo cliente
String regex = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$";
Pattern pattern = Pattern.compile(regex);
int tamLista = clienteList.size();
// Divisão do valor da lista com a quantidade de Clientes
// (variável subtotal provém de outro trecho que soma o valor total da lista de compras)
int total = (subtotal / tamLista) / 100;
// captura o resto da divisão
int restoTotal = subtotal%tamLista;
for (String cliente : clienteList) {
Matcher matcher = pattern.matcher(email);//validação e-mail
if(matcher.matches() == true){//verificar se o email do cliente é válido
// Tamanho da lista de Clientes
// Criação do Map
Map<String, Integer> clienteMap = new HashMap<>();
//Tratamento do resto
if (restoTotal > 0) {
clienteMap.put(cliente, total+ 1 );
restoTotal--;
}else clienteMap.put(cliente, total);
// Exibição dos dados com forEach utilizado em Java 8
clienteMap.forEach((clienteChave, totalValor) ->
System.out.println("A pessoa: " + clienteChave + " está devendo " + totalValor + " reais.")
);
}else{
System.out.println("E-mail inválido!");
tamLista--;
}
}
} catch (IOException e) {
System.out.println("Erro com o arquivo! Por favor, escolha um arquivo diferente.");
}
Para excluir o e-mail inválido do ArrayList eu também tentei remove() e não funcionou, ele não percorreu o restante da lista e deu erro.
Não sei se consegui ser clara na dúvida, mas eu precisava tratar a validação de dados. Tentei várias opções e nenhuma funcionou.