Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Desafio 8 #12

Open
dor-95 opened this issue Sep 19, 2023 · 5 comments
Open

Desafio 8 #12

dor-95 opened this issue Sep 19, 2023 · 5 comments

Comments

@dor-95
Copy link

dor-95 commented Sep 19, 2023

Oi @cami-la , tudo bem?

Eu realizei a implementação do desafio 8, mais parece estar complexo, ainda não consegui pensar em uma forma de melhorar. Sabe me dizer outra forma de resolver?

Minha implementação:

Desafio 8 - Somar os dígitos de todos os números da lista:
Utilizando a Stream API, realize a soma dos dígitos de todos os números da lista e exiba o resultado no console.

List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3, 11, 28, 35, 180, 110, 200, 245);

    int resultado = numeros.stream().mapToInt(n -> {
        if (n / 10 == 0) return n;
        int sum = 0;
        int length = String.valueOf(n).length();
        for (int i = 0; i < length; i++) {
            sum += n % 10;
            n = n / 10;
        }
        return sum;
    }).sum();

    System.out.println("A soma dos dígitos de todos os números da lista é: " + resultado);`
@jeziel-almeida
Copy link

Só usar o reduce:

numeros.stream().reduce(0, Integer::sum);

ou

numeros.stream().reduce(0, (n1, n2) -> n1 + n2);

@Saul-Medeiros
Copy link

acho que vc pode remover aquele if do começo, e retornar apenas sum. Eu fiz assim

int somaDigitos = numeros.stream().mapToInt(n1 -> {
            int sum = 0, length = String.valueOf(n1).length();
            for (int i = 0; i < length; i++) {
                sum += n1 % 10;
                n1 /= 10;
            }
            return sum;
        }).sum();

o sum retorna 0 se o numero em questão nao existir, pois o for já faz essa verificação, se o numero não existir ele passa direto pelo laço e retorna 0

@dor-95
Copy link
Author

dor-95 commented Oct 17, 2023

Então @Saul-Medeiros, pelo que pude perceber o IF acaba realizando a conferência quando o número possui apenas 1 dígito, não sendo necessário entrar uma vez no laço do FOR e retornando ele mesmo para fazer parte da soma. Ou seja, ele acaba economizando algumas interações do FOR.

@Saul-Medeiros
Copy link

Saul-Medeiros commented Oct 17, 2023

neste caso, não passando pelo laço ele seria mais rápido 🤔? é pq na minha concepção quanto menos código vc escrever é melhor, e pra cada número que o mapForInt* for testar ele vai ser obrigado a passar por esse if e pelo próprio for.
No caso do seu código ele vai retornar o numero quando o tamanho dele for 0, ou seja inexistente. Se por via das dúvidas ainda tiver um "null" no array, acredito que poderia lançar uma exception.

@dor-95
Copy link
Author

dor-95 commented Oct 17, 2023

Rapaz, nem tinha parado para testar o tempo, agora fiz um teste básico com o System.currentTimeMillis(), no array que ta ali nessa descrição com e sem o if o resultado foi 0 ms. Pode ser que fique melhor sem o IF mesmo, mais legível.

Nesse exercício, como temos que somar todos os dígitos, esse IF verifica quantos dígitos tem o número e caso ele tenha apenas um (exemplo: 5) ele já retorna esse resultado devido o return, debuguei no Intellij pra ver kk. Agora no caso de algum número com mais de um dígito (exemplo: 245), ele segue para o FOR para decompor e realizar a somatório. No caso de ter um null, ele lança a exceção com ou sem o IF.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants