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

Preencher lista2 com base na lista1

Boa tarde pessoal,

Possuo duas listas de tamanhos diferentes, onde preciso preencher com o valor 0 alguns indices da lista 2, que só existem na 1. Exemplo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

As listas são essas acima. Eu preciso preencher com zero as colunas 00:30, 00:45, 01:00 e 01:15 que não existem na lista de baixo. Como eu posso fazer isso?

7 respostas

Olá, Nayara!

Teria como dar mais detalhes sobre a implementação que você já tem? A implementação pode variar bastante, de acordo com o tipo de estrutura que você está usando.

Olá Mateus,

Estou usando ArrayList, fiz um for pra percorrer a lista maior, dentro dele um if para comparar os horários, que quando acha um horário diferente, era para inserir o valor zero, no indice da lista 2. Mas não deu certo.

Acredito que eu deva ter que "abrir" essa lista2 e colocar 0 nos indices que eu preciso, mas não to sabendo montar a lógica pra fazer isso rs.

Muito bem, Nayara... Vamos tentar umna solução:

O método Add() da classe ArrayList pode receber dois parâmetros: A posição que você quer inserir um elemento, e o elemento em si.

Toda vez que você encontrar um horário diferente, basta chamar a função Add() da seguinte maneira:

i = variável que percorre o for
if(acheiHorarioDiferente) {
    // adiciona um novo elemento na posição i, tendo o horário como o horário que existe na lista 1 
    // mas não existe na lista 2, e o valor = 0
    lista2.Add(i, new Elemento(lista1.elemento[i].horario, 0))
}

Lembrando que é apenas um pseudocódigo. Para uma implementação mais real, você teria q fornecer detallhes do seu código.

Tentei fazer dessa forma:

        List<String> horarios = new ArrayList<>();
        horarios.add("00:00");
        horarios.add("00:15");
        horarios.add("00:30");
        horarios.add("01:00");
        horarios.add("01:15");
        horarios.add("01:30");

        List<String> horariosAux = new ArrayList<>();
        horarios.add("00:00");
        horarios.add("01:00");
        horarios.add("01:30");

        for (int i = 0; i < horarios.size(); i++) {
            if (!horarios.get(i).equals(horariosAux.get(i))) {
                horariosAux.add(i, horarios.get(i));
            }
        }

Mas deu o seguinte erro: file:///home/renan/Imagens/Screenshot_20220309_195457.pngInsira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Olá, Nayara!

A exceção IndexOutOfBoundsException ocorre quando você tenta acessar um índice além do tamanho de uma lista ou array.

Observe que o seu for recebe o tamanho de horarios como condição de parada, e você tenta acessar o índice i de horariosAux, que tem um tamanho menor do que horarios, logo, você acabará excedendo o tamanho de horariosAux e acessando uma posição que não existe, ocasionando essa exceção.

Podemos contornar essa situação utilizando o método contains(), que simplesmente verifica se um item está presente em um array. Com isso, não precisamos nos preocupar com o tamanho de horariosAux, mas sim em checar, uma a uma, se todas as strings contidas em horarios estão também em horariosAux.

O código ficaria assim:

List<String> horarios = new ArrayList<>();
horarios.add("00:00");
horarios.add("00:15");
horarios.add("00:30");
horarios.add("00:45");
horarios.add("01:00");
horarios.add("01:15");
horarios.add("01:30");

List<String> horariosAux = new ArrayList<>();
horarios.add("00:00");
horarios.add("01:00");
horarios.add("01:30");

for (int i = 0; i < horarios.size(); i++) {
    if (!horariosAux.contains(horarios.get(i))) {
        horariosAux.add(i, horarios.get(i));
    }
}

Espero ter ajudado!

Caso necessite de qualquer alteração, é só avisar!

No mais, boa sorte em seus estudos!

Deu certo Mateus, muito obrigado!

Ótimo, Nayara!

Só fazendo uma pequena observação: Essa implementação funciona porque a sua lista é de tipo primitivo (no caso, String).

Se por um acaso você tiver uma lista de objetos de alguma classe (por exemplo, uma classe Registro, que armazena o horário e algum dado associado a esse horário), o método contains passará a comparar as referências de objeto (endereço de memória onde o objeto está guardado) e não os valores dentro do objeto.

Para que o método contains compare o conteúdo do objeto, devemos sobrescrever o método equals().

Você pode ver como fazer isso nessa excelente aula do mestre Nico: https://cursos.alura.com.br/course/java-util-lambdas/task/37823

Mais uma vez, boa sorte em seus estudos!