Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

msr

Eliminar metade dos elementos numa LinkedList

Mensagens Recomendadas

msr

Olá,

Queria eliminar metade dos elementos duma LinkedList. Como é que o posso fazer?

Por exemplo:

lista.size() == 10

Teriam que ficar apenas os 5 primeiros.

Como a lista é ligada basta percorrer até ao elemento do meio (neste caso o 5º elemento) e colocar o próximo a NULL, certo? No entanto não estou a ver como é que isso se faz através dos métodos que a classe tem disponíveis. Será com um Iterator? Mesmo assim não estou a ver como fazer.

Se me pudessem dar um exemplo de código era o ideal.

Obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Colocar o próximo elemento? Isso é comum em C, em Java não tens acesso ao "próximo elemento".

Terás de colocar todos os elementos a partir de determinado indíce como null. Mas isso não reduz o tamanho da lista, apenas diz que os elementos a partir de determinada posição são null.

A forma mais simples, é percorrer os elementos da lista que queres manter, com iterador ou com foreach, e colocar esses elementos numa lista nova, no fim fazer a atribuição das variáveis de acordo com o que precisares.

Não há forma de tornar a lista mais curta.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msr

Eu realmente venho de C e a minha experiencia com listas em Java é praticamente nula, daí a confusão.

Se calhar devia ter escrito "remover" em vez de "eliminar". O que eu quero é remover elementos dessa lista.

A lista está ordenada e o que eu quero é deixar apenas os "lista.size() / 2" primeiros.

O que dizes é criar uma nova instancia de LinkedList, copiar para ela os elementos que quero manter e depois trocar as referências das listas?

Não há forma mais "natural" de fazer isto em Java? (ie, sem recorrer a uma lista auxiliar)

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vasco16

Olá,

Queria eliminar metade dos elementos duma LinkedList. Como é que o posso fazer?

Por exemplo:

lista.size() == 10

Teriam que ficar apenas os 5 primeiros.

Como a lista é ligada basta percorrer até ao elemento do meio (neste caso o 5º elemento) e colocar o próximo a NULL, certo? No entanto não estou a ver como é que isso se faz através dos métodos que a classe tem disponíveis. Será com um Iterator? Mesmo assim não estou a ver como fazer.

Se me pudessem dar um exemplo de código era o ideal.

Obrigado!

Hum..

lista.size() == 10

//tens de te ter em atencao os numeros pares/impares do size

for(int i = lista.size()/2; i < lista.size(); i++){

lista.remove(i);

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Se calhar devia ter escrito "remover" em vez de "eliminar". O que eu quero é remover elementos dessa lista.

Para remover basta usares o método remove(int) das listas ou o remove(object) conforme o tipo de remoção, isto é, se tens o índice ou se tens o objecto que queres remover.

Não há forma mais "natural" de fazer isto em Java? (ie, sem recorrer a uma lista auxiliar)

Esta seria uma forma natural já que tem em conta o princípio de encapsulamento de objectos. Na verdade não sabes se a lista é duplamente ligada, se é uma lista com cabeça e cauda (ou lá como chamam a uma lista com máximo e mínimo), se é implementada com um array se usa outras estruturas, enfim. O que sabes é que uma LinkedList, por exemplo, implementa uma lista ligada seguindo a interface List, não sabes sequer se há noção de nó, de próximo ou de anterior na implementação interna.

Em C é normal aceder ao próximo elemento ou ao elemento anterior, porque efectivamente, são dois ponteiros a que tens acesso. Em Java, e tendo em conta o principio de encapsulamento de informação, nunca terás acesso a esses dados. Se reparares uma estrutura dá-te sempre métodos para acederes aos teus dados, nunca à organização interna.

Mas se queres simplesmente remover, podes fazer como o vasco16 disse, dependendo do tipo de List, vai funcionar. Para implementações que tenham noção de tamanho e de número de elementos podes ter de alterar o método que te diz quantos elementos lá estão dentros, por exemplo em ArrayList.

No caso de usares iteradores, podes usar o método remove() do iterador, que remove o elemento actual. Atenção que não podes alterar a estrutura de uma lista (remover e inserir elementos) se a estiveres a percorrer.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.