Como fazer a remoção por valor em uma lista no Java? Desde já agradeço

5 respostas
java
L
package br.com.listas;

//definicao da classe List
public class Lista {
	
	private ListaNo primeiroNo;// Declara variavel de instancia com o nome de PrimeiroNó
	private ListaNo ultimoNo;// Declara variavel de instancia com o nome de UltimoNó
	private String nome; // String como 'lista' usada na impressao
	private int tamanhoLista;

	// construtor cria List vazia com 'list' como o nome
	public Lista() {
		this("Lista");
		this.tamanhoLista = 0;
	}// fim do construtor sem argumentos List
		
	// construtor cria uma List vazia com um nome
	public Lista(String nomeDaLista) {
		nome = nomeDaLista;
		primeiroNo = ultimoNo = null;
		this.tamanhoLista = 0;
	}// fim do construtor de um argumento List
		// Insere Object na frente de List

	public void insereNoInicio(Object insertItem) {
		if (estaVazia()) { // first e lastNode referenciam o mesmo objeto
			primeiroNo = ultimoNo = new ListaNo(insertItem);
		} else {
			primeiroNo = new ListaNo(insertItem, primeiroNo);
		}// fim do método insereNoInicio
		
		this.tamanhoLista++;
	}// fim do método insereNoInicio
		
	// insere Object no fim de Lista
	public void insereNoFim(Object insertItem) {
		if (estaVazia()) {
			primeiroNo = ultimoNo = new ListaNo(insertItem);
		} else {
			ultimoNo = ultimoNo.proximoNo = new ListaNo(insertItem);
		}
		this.tamanhoLista++;
	}// fim do método insereNoFim
	
	
	//Insere na posição informada
	public void insertAtPosicao(int posicao, Object elemento) {
		 if(posicao == 0){ 
		    insereNoInicio(elemento);
		  } else if(posicao == this.tamanhoLista){ 
		    insereNoFim(elemento);
		  } else {
			  if(posicao > 0 && posicao < this.tamanhoLista) {
				  ListaNo antes = primeiroNo;
				  
				  for(int i=1; i < posicao; i++) {
					  antes = antes.getProximoNo();
				  }
				  
				 ListaNo novo = new ListaNo(elemento, antes.getProximoNo());
				 antes.setProximoNo(novo);
				 this.tamanhoLista++;
			  }else {
				  System.out.println("Posição Inválida");
			  }
		  }		
	}
	
	// remove o primeiro nó de List
	public Object removeNoInicio() throws EmptyListException {
		if (estaVazia()) {
			throw new EmptyListException(nome);
		}
		Object removedItem = primeiroNo.data; // recupera dados sendo removidos
		// atualiza referências primeiroNo e ultimoNo
		if (primeiroNo == ultimoNo) {
			primeiroNo = ultimoNo = null;
		} else {
			primeiroNo = primeiroNo.proximoNo;
		}
		this.tamanhoLista--;
		return removedItem;// retorna dados de nó removidas
	}// fim do método removeNoFim

	public Object removeNoFim() throws EmptyListException{
		if (estaVazia()){
			throw new EmptyListException(nome); //lança excessão se List estiver vazia
		} 
		
		Object removedItem = ultimoNo.data; //recupera dados sendo removidos
		
		//atualiza referências primeiroNo e ultimoNo
		
		if(primeiroNo == ultimoNo){
			primeiroNo = ultimoNo = null;
		}
		
		else{ //localiza o novo último nó
			ListaNo current = primeiroNo;
		
			//faz loop enquanto nó atual não referencia lastNode
			while(current.proximoNo != ultimoNo){
				current = current.proximoNo;
			} 
			
			ultimoNo =	current; //atual é	novo lastNode
			current.proximoNo = null;
		}//fim do else
		
		this.tamanhoLista--;
		return removedItem; //retorna dados de nó removidos
	}//fim do método removeNoFim
	

	public Object removeFromPosicao(int posicao) throws EmptyListException {
		Object removedItem = null;
		
		if(posicao == 0){ 
		    removeNoInicio();
		  } else if(posicao == this.tamanhoLista -1){ 
		    removeNoFim();
		  } else {
			  if(posicao >= 0 && posicao < this.tamanhoLista) {
				  ListaNo antes = primeiroNo;
				  
				  for(int i=1; i < posicao; i++) {
					  antes = antes.getProximoNo();
				  }
				  
				 removedItem = antes.getProximoNo().data;
				 				 
				 //ATUALIZANDO A ORDEM DA LISTA
				 ListaNo anterior = antes;
				 ListaNo itemPosicao = antes.getProximoNo();
				 ListaNo proximo = itemPosicao.getProximoNo();
				 
				 anterior.setProximoNo(proximo); 
			  }else {
				  System.out.println("Posição Inválida");
			  }
		  }	
		
		this.tamanhoLista--;
		return removedItem;
	}
	
	
	
	public boolean buscaElemento(Object elemento) {
		 if(elemento == null){
			    throw new IllegalArgumentException("Elemento não foi informado");
		  }

		  ListaNo atual = primeiroNo;
		  boolean achou = false;
		  	
		  if((atual.data).equals(elemento)) {			  
			 return true; 
		  }else {
			  for (int i = 0; i < tamanhoLista; i++) {
				  atual = atual.getProximoNo();
				  
				  if((atual.data).equals(elemento)) {
					  achou = true;
					  break;
				  }
			  }
		  }
		  
		  return achou;
	}
	
	
	// Determina se a lista estiver vazia
	public boolean estaVazia() {
		return primeiroNo == null; // retorna true se List estiver vazia
	}// fim do método estaVazia
		// gera saída do conteúdo de List

	public void print() {
		if (estaVazia()) {
			System.out.printf("Lista Vazia %s\n", nome);
			System.out.println(imprimeTamanho());
			return;
		}// fim do if
		
		System.out.printf("A lista %s é: ", nome);
		ListaNo current = primeiroNo;
		// enquanto não estiver no fim da lista, gera saída dos dados do nó
		// atual
		while (current != null) {
			System.out.printf("%s -> ", current.data);
			current = current.proximoNo;
		}// fim do While
		System.out.printf("\n");
		System.out.println(imprimeTamanho());
	} // fim do método print
	
	public String imprimeTamanho(){
		return "Tamanho da Lista: "+this.tamanhoLista;
	}
}// fim da classe List

5 Respostas

F

Onde esta definição de ListNo?

L

package br.com.listas;

//classe para representar um n� em uma lista

public class ListaNo {

Object data;

ListaNo proximoNo;
ListaNo(Object object) {
	this(object, null);
}// Fim do construtor de um argumento ListaNo

// construtor cria ListaNo que referencia

// Object e o prximo ListaNo
ListaNo(Object object, ListaNo node) {
	data = object;
	proximoNo = node;
}// fim do construtor de dois argumentos ListaNo

//seta um objeto data
public void setData(Object data){
	this.data = data;
}

// retorna referncia aos dados no n
Object getData() {
	return data; // retorna Object nesse n
}// fim do mtodo getObject
	// retorna referncia ao prximo n na lista

ListaNo getProximoNo() {
	return proximoNo; // obtm prximo n
}// fim do mtodo getNext

public void setProximoNo(ListaNo novo) {
	// TODO Auto-generated method stub
	this.proximoNo = novo;
}

}// fim da classe ListaNo

L

Bem, isso é Estrutura de Dados, no Java isso já vem encapsulado, logo a pessoa pode realizar pilha, fila, lista, etc, sem precisar de aqueles processos todos, usando apenas uma estrutura de conjunto, como ArrayList, Set, dentre outras, de definindo a posição do objeto listado por uma estrutura de repetição, especialmente o for. Já em outras , como o C, C++, isso não ocorre, logo se tem necessidade de saber estrutura de dados pra fazer listas automáticas, usando como princípio básico o ponteiro. Não tem ponteiro em java. Se quiser usar o princípio de lista em Java, é possível mas desnecessário, mas primeiro ache o valor a ser apagado, junte os nós das extremidades, anule os nós da posição específica e depois anule a posição.

D

Independente disso, vocẽ pode criar suas estruturas próprias, tanto no C, C++ ou java ou qualquer linguagem.

Sobre a questão: você possui o método buscaElemento e possui o método removeFromPosicao. Creio que o buscaElemento deveria retornar um inteiro referente a posição em que encontrou o item. Assim você poderia chamar o removeFromPosicao (por que não removeDaPosicao ou removeFromPosition?).

L

Seguindo a orientação do @darlan_machado, vc irá conseguir remover. Vc teve alguma dificuldade quando vc tentou remover o elemento?

Criado 26 de outubro de 2019
Ultima resposta 28 de out. de 2019
Respostas 5
Participantes 5