Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Teste em caso lances com valores iguail

Ola Alex, na verdade não é uma dúvida, apenas queria colocar aqui mais uma teste que eu testei em caso de ocorrência de lance com os valores iguais. Por exemplo: Valor lance 1 = 500 Valor lance 2 = 500 Valor lance 3 = 500 Valor lance 4 = 100 Valor lance 5 = 200 Teriamos então três lances iguias e sendo assim, seria mostrado o três maiores lances com os mesmo valores, então por isso implementei o seguinte código.

//Classe de testes
  private final Leilao CONSOLE = new Leilao("Console");
    private final Lance FELIPE_LANCE_500 = new Lance(new Usuario("Felipe"), 500.0);
    private final Lance FRAN_LANCE_310 = new Lance(new Usuario("Fran"), 310.0);
    private final Lance RODRIGO_LANCE_250 = new Lance(new Usuario("Rodrigo"), 250.0);
    private final Lance ROBERTA_LANCE_100 = new Lance(new Usuario("Roberta"), 100.0);
    private final double DELTA = 0.0001;

 @Test
    public void deve_DevolverTresMaioresLances_QuandoRecebeMaisDeTresLancesComValoresIguail() {
        CONSOLE.propoe(FELIPE_LANCE_500);
        CONSOLE.propoe(FELIPE_LANCE_500);
        CONSOLE.propoe(FELIPE_LANCE_500);
        CONSOLE.propoe(FELIPE_LANCE_500);
        CONSOLE.propoe(RODRIGO_LANCE_250);
        CONSOLE.propoe(FRAN_LANCE_310);
        CONSOLE.propoe(ROBERTA_LANCE_100);
        List<Lance> tresMaioresLancesDevolvidos = CONSOLE.tresMaioresLances();
        assertEquals(3, tresMaioresLancesDevolvidos.size());
        assertEquals(500, tresMaioresLancesDevolvidos.get(0).getValor(), DELTA);
        assertEquals(310, tresMaioresLancesDevolvidos.get(1).getValor(), DELTA);
        assertEquals(250, tresMaioresLancesDevolvidos.get(2).getValor(), DELTA);
    }

//Classe Leilao

public class Leilao implements Serializable {
    //Demais métodos e atributos

 public List<Lance> tresMaioresLances() {
        int quantidadeMaximaLances = lances.size();
        if (quantidadeMaximaLances > 3) {
            return getTresMaioresLances();
        }
        return lances.subList(0, quantidadeMaximaLances);
    }

    private List<Lance> getTresMaioresLances() {
        List<Lance> tresMaioresLances = new ArrayList<>();
        tresMaioresLances.add(lances.get(0));
        int counter = 1;
        while (tresMaioresLances.size() < 3) {
            Lance lance = lances.get(counter);
            if (!tresMaioresLances.contains(lance)) tresMaioresLances.add(lance);
            counter++;
                if (counter == quantidadeMaximaLances) break;
        }
        return tresMaioresLances;
    }
}
3 respostas

Após uma nova análise no meu código, fiz as seguintes alterações devido à casos de apenas 2 ou 3 lances com valores iguais.

public List<Lance> tresMaioresLances() {
        int quantidadeMaximaLances = lances.size();
        if (quantidadeMaximaLances > 3) {
            quantidadeMaximaLances = 3;
        }
        return getTresMaioresLancesValoresDiferentes(quantidadeMaximaLances);
    }

    @NonNull
    private List<Lance> getTresMaioresLancesValoresDiferentes(int quantidadeMaximaLances) {
        if (quantidadeMaximaLances < 1) return lances;

        List<Lance> tresMaioresLances = new ArrayList<>();
        tresMaioresLances.add(lances.get(0));
        int counter = 1;

        while (tresMaioresLances.size() < quantidadeMaximaLances) {
            Lance lance = lances.get(counter);
            if (!conferirSeJaExisteValor(tresMaioresLances, lances.get(counter).getValor()))
                tresMaioresLances.add
                    (lance);
            counter++;
            if (counter == quantidadeMaximaLances) break;
        }
        return tresMaioresLances;
    }

    private boolean conferirSeJaExisteValor(List<Lance> tresMaioresLances, double valor) {
        for (Lance lance :
                tresMaioresLances) {
            if (lance.getValor() == valor) {
                return true;
            }
        }
        return false;
    }
solução!

Oi Elias, tudo bem?

Acho que dá pra fazer até mais simples, por exemplo, ao invés de colocar toda a lógica na busca, você pode simplesmente impedir que lances com o mesmo valor sejam adicionados, da mesma maneira que validamos os casos excepcionais no segundo curso :)

[]s

Sim, eu fui um pouco precipitado, quando fiz o segundo curso, já não era mais nescessário essas validaçoes.