Distribuição de valores de uma lista exibida em Map

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?

  1. O primeiro com 3 reais e os demais com 1
  2. 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);
}
2 curtidas

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.

Quando eu tirei o Map de dentro do for ele exibe todas as chaves juntas e depois o valor

Ex: Cliente1, Cliente2, Cliente3, Cliente4 está devendo XX reais.

Aí quando vou tratar o resto não funciona porque estão todas as chaves na mesma linha e um valor.

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.