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

Como não mover uma posição vazia e pegar o próximo valor?

Método adiciona

public void add(int index, Student student) {
        if (index > students.length) 
            throw new ArrayIndexOutOfBoundsException(index + " > " + students.length);

        for (int i = studentsCount - 1; i >= index; i -= 1)
            students[i + 1] = students[i];

        students[index] = student;
        studentsCount++;
    }

Teste

@Test
    public void addStudentInNullPosBeforeFilledPos() {
        students.add(1, s2);
        students.add(2, s1);
        students.add(0, s3);

        assertEquals("[Leticia, Edson, Karen, null, null, null, null, null, null, null]", students);
        assertEquals(3, students.size());
    }

De início temos adicionados os elementos s2 (ownn.. seria Student 2, ok?)

voltando, adicionei o elemento s2 na posição 1 e o elemento s1 na posição 2.

A posição 0 ficou nula e quero adicionar o elemento s3 nela, após adicionar, minha posição 1 fica nula, pois nós movemos as posições a direita.

Como resolver este problema?

Abraços.

9 respostas

E aí, Edson! Beleza, cara? =)

Se entendi corretamente, o que você precisa fazer é apenas verificar se a posição que você está tentando inserir um elemento está ou não ocupada, sacou?

Para isso, um if deve resolver! Assim:

public void add (int index, Student student) {
    if (index > students.length) {
        throw new ArrayIndexOutOfBoundsException(index + " > " + students.length);
    }


    // Antes de mover os elementos, verifica se está diferente de nulo...
    if (!students[index].equals(null)) {
        for (int i = studentsCount - 1; i >= index; i--) {
            students[i+1] = student[i];
        }
    }

    students[index] = student;
    studentsCount++;
}

Repare que eu verifiquei se a posição é diferente de null (observe o sinal na frente - !). Se for, quer dizer que a posição está ocupada... Nesse caso, podemos mover todos os elementos para frente. Caso contrário, simplesmente adicionamos o elemento na posição que queremos (o bloco será ignorado, executando apenas students[index] = student, sacou? =)

Espero ter ajudado, mas qualquer dúvida não deixe de postar por aqui, no fórum, para que possamos continuar a ajudá-lo! =)

Abraço e bons estudos, cara!

Fábio

Edson, tudo bem ?

Pelo seu for, tecnicamente ela não fica nula não, toda vez antes de adicionar alguma coisa, você pega as posições nulas e coloca a próxima instância válida.

Ou seja, quando você add o s2 ele vai para a posição que você quer, mas quando você add o s1, o s2 passa para a posição 0, ai quando você add o s3, o s1 vai para a posição 1 e aí você faz troca de objetos, ou seja, o seu s2 vai para o limbo e o s1 assumi o lugar dele.

Espero ter deixado um pouco mais claro o que está acontecendo.

Abraços

@Matheus Brandino

Mas exatamente por empurrar é que não funciona essa solução. Eu não estou apenas ocupando a posição zero, mas sim movendo o que tem nela para frente.

Posição 0 = null, assim o null vai para a posição 1. Mas eu queria manter o meu estudante lá ou o correto é mover uma casa nula?

Se tiver que mover nulo mesmo, precisaria também terminar de mover todos os elementos, mas como minha lista andou apenas 2 casas a esquerda, ele vai mover só duas para a direita e perdendo o meu estudante 1 que estava adicionado na posição 2.

students.add(1, s2);
students.add(2, s1);
students.add(0, s3);
[Leticia, null, Karen, null, null, null, null, null, null, null]

@Fábio Takeo Ueno

Se eu fizer essa validação de null, só adicionarei valores em campos diferentes de nulo quando adicionar por posições.

Se students[1] for nulo não consigo adicionar valor nesta posição.

students.add(1, s2);

Obrigado pelo suporte. ;) Abraços.

Edson,

Sem problemas, estamos aqui para ajudá-lo! =)

Você chegou a testar esse código? =|

Digo isso, pois a linha que de fato insere o elemento na lista students[index] = student, está fora de qualquer validação... Dessa forma, na minha cabeça, o elemento deveria ser inserido de qualquer forma, sacou?

A diferença é que se a posição for diferente de nulo, iremos mover os elementos para a direita, liberando espaço, sacou?

Agora eu estou com dúvida sobre a sua pergunta. Rs. A ideia é inserir um elemento numa posição... Se ela estiver ocupada, empurramos os elementos, caso contrário, apenas insere, correto? =)

Fábio

SIm, testei. :)

Essa linha que faz atribuição é do valor passado para determinada posição, a validação é apenas para mover as outras posições, assim como explicado na aula.

Uma coisa que vi estudando a classe Vector, é necessário ter um elemento na posição para adicionar um novo elemento na mesma posição e fazer o shift.

Não é possível fazer isso, não existe nenhum elemento nesta posição:

Vector vector = new Vector();
vector.add(5, new String("adicionando na posicao 5");

Apenas se eu já tiver essa posição já preenchida.

vector.add("adicionando na posicao 0");
vector.add("adicionando na posicao 1");
vector.add("adicionando na posicao 2");

 vector.add(2, "adicionando na posicao 2 e vou empurrar o atual para a proxima posicao");

Como estudo eu criei este exemplo e vou melhorando ele (farei isso para os outros cursos também): https://github.com/eapmartins/labs/tree/master/data-structure

Edson,

Você conseguiu resolver?

Baixei o projeto que você disponibilizou e estou tentando fazer uns testes nele. Mas, da forma como está implementado, não é possível adicionar fora da sequência, devido ao método indexIsValid()... Você chegou a contornar isso, alterando esse método?

Fábio

Oi Fábio,

Essa era a minha dúvida inicial, se deveriamos adicionar fora da sequência. Mas estudando a classe Vector, não deveria ter esse comportamento, a não ser que já exista valores nesta posição a gente consegue adicionar valores sem ser na sequência.

No curso eu fiquei confuso, mas aparentemente o Mauricio criou este método para isso.

private boolean posicaoValida(int posicao) {
    return posicao >= 0 && posicao <= totalDeAlunos;
}

Então se não tem aluno na determina posição, não é possível adicionar fora da sequência, só quando já existir o elemento.

Correto? Era isso que o professor queria passar ou deveríamos adicionar elemento em qualquer posição sem ser sequêncial? A classe Vector do Java não permite.

Abraços.

solução!

Edson,

Boa! Se não me engano a ideia é essa, mesmo. O vetor é um armazenamento sequencial, ou seja, não pode ter buracos no meio dele, sacou? Você pode e consegue criar buracos se você quiser, mas ele deixará de ser essa estrutura conhecida como Vetor, sacou? =)

Fábio

Sim. Legal. Deu pra entender bem, agora não tenho dúvidas de como funciona o Vetor. Legal entender bem estes detalhes e não apenas usar.

Valeu e até a próxima.