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

[Dúvida] Dúvida sobre laço de repetição for

Olá passoal, por favor me ajudem com essa dúvida cruel! Estou tentando resolver um kata(desafio) do CodeWars e não sei porque o laço que eu implementei está retornando essa resposta: [e_, e_, e_]

Segue descrição do desafio e código: https://www.codewars.com/kata/515de9ae9dcfc28eb6000001 Kata: SplitStrings (6kyu): Conclua a solução para que ela divida a string em pares de dois caracteres. Se a string contiver um número ímpar de caracteres, ela deverá substituir o segundo caractere ausente do par final por um sublinhado (''). Ex.: 'abc' => ['ab', 'c']; 'abcdef' => ['ab', 'cd', 'ef'].

import java.util.ArrayList;
import java.util.Arrays;

public class TesteString {

    public static void main(String[] args) {

        String s = "abcde";
        if (s.length() % 2 != 0)
            s = s + '_';
        String[] answer = new String[s.length() / 2];
        for (int i = 0; i < s.length(); i += 2) {
            for (int j = 0; j < answer.length; j++) {
                String sub = s.substring(i, i + 2);
                answer[j] = sub;
            }
        }
        System.out.println(Arrays.toString(answer));
    }

}

Console: [e_, e_, e_]

2 respostas
solução!

Temos que como s é impar, a nova string passar a ser "abcde_".

Answer terá tamanho = 3.

Primeira interação do primeiro for, você possui i = 0 e j =0. sub = ab e answer[0] = ab. Na segunda i = 0 e j = 2. Note que não teve alteração para i, logo continua com a substring de 0 a 2. sub = ab e answer[1] = ab. A terceira interação é idêntica.

Segunda interação do primeiro for, i =1 e j =0. substring de 1 a 3. sub = bc. Note que j continua com 0, sobrescrendo o valor feito anteriormente. answer[0] = bc. Novamente, temos answer[1] = bc e answer[3] = bc.

Daí chegamos na terceira interação do primeiro for, os caso se repetem e é por isso que você termina com a string e_.

Note que o uso do for encadeado está gerando o problema da sobrescrita. Abaixo segue uma ideia para refatoração.

Realizei a remoção do for e adicionei uma variável para mapear a inserção do answer. Também adicionei uma variável limite para verificar se o tamanho da string não foi estourado e aparentemente o erro foi corrigido. Caso não queira spoiler, para de ler aqui. :) Segue a parte que foi alterada.

        int i = 0;
        int limit;

        for (int j = 0; j < s.length(); j += 2) {
            limit = 2 + j;

            if (limit > s.length()) {
                limit = s.length();
            }

            answer[i] = s.substring(j, limit);

            i ++;
        }

Espero que ter ajudado. Boa sorte nos estudos.

Obrigado Isabela, aprendi muito!