Jump to content

[Resolvido] trocar as posições entre dois elementos de uma ArrayList usando Collections.swap(item)


mirador_22
 Share

Recommended Posts

Eu tenho este exemplo de como podemos trocar elementos Dentro de um arrayList

package estudo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Estudo {
public static void main(String[] args) throws Exception {
	// cria uma ArrayList que conterá strings
	List<String> figuras = new ArrayList<>();
	// adiciona itens na lista
	figuras.add("F1");
	figuras.add("F2");
	figuras.add("F3");
	figuras.add("F4");
	System.out.println("\n--- Lista de Figuras ---");
	for (String nome : figuras) {
		System.out.println(nome);
	}
	// Vamos trocar as posições dos 1º e 3º elementos
	System.out.print("\n--- Mover F2 para Cima ---");
	Estudo.moverParaCima(figuras);

	 // exibe os elementos da ArrayList
	System.out.println();
	for (String nome : figuras) {
		System.out.println(nome);
	}

	// Vamos trocar as posições dos 1º e 3º elementos
	System.out.print("\n--- Mover F3 para Baixo ---");
	Estudo.moverParaBaixo(figuras);
	// exibe os elementos da ArrayList
	System.out.println();
	for (String nome : figuras) {
		System.out.println(nome);
	}
	System.exit(0);
}
public static boolean moverParaCima(List<String> elemento) throws Exception {
	if (elemento == null) {
		throw new Exception("Elemento não existe");
	} else if (elemento != null) {
		Collections.swap(elemento, 0, 1);
		return true;
	}
	return false;
}


 public static boolean moverParaBaixo(List<String> elemento) throws Exception {
	if (elemento == null) {
		throw new Exception("Elemento não existe");
	} else if (elemento != null) {
		Collections.swap(elemento, 2, 3);
		return true;
	}
	return false;
}
}

e o output: é

--- Lista de Figuras ---

F1

F2

F3

F4

--- Mover F2 para Cima ---

F2

F1

F3

F4

--- Mover F3 para Baixo ---

F2

F1

F4

F3

A minha duvida é como selecionar um objeto dentro de Arraylist para que eu possa trocar com o próximo elemento se no caso quiser moverParaBaixo e trocar com o elemento anterior se no caso, moverParaCima.

mas num metodo com esta estrutura

public class FormaComposta {

private ArrayList<FormaGeometrica> formaGeometrica;

public FormaComposta() {
	this.formaGeometrica = new ArrayList<>();
}

/**
 * Troca de posição com o elemento imediato seguinte. O método poderá não
 * ser bem sucedido se o elemento de referência for o último.
 *
 * @param elemento elemento de referência para a troca
 * @return true se troca foi bem sucedida. false, c.c.
 * @throws ElementoInexistenteException se o elemento não existir
 */
@Override//DUVIDA AQUI
public boolean moverParaCima(FormaGeometrica elemento) throws ElementoInexistenteException {
	if (elemento != null) {
		throw new ElementoInexistenteException("Elemento não existe");
	} else if (elemento != null) {
		for (FormaGeometrica formaGeometrica1 : this.formaGeometrica) {
			if (formaGeometrica1 == elemento) {
				Collections.swap((List<FormaGeometrica>) elemento, 0, 0);
			}
		}
		return true;
	}
	return false;
}

/**
 * Troca de posição com o elemento imediato anterior. O método poderá não
 * ser bem sucedido se o elemento de referência for o primeiro.
 *
 * @param elemento elemento de referência para a troca
 * @return true se troca foi bem sucedida. false, c.c.
 * @throws ElementoInexistenteException se o elemento não existir
 */
@Override//DUVIDA AQUI
public boolean moverParaBaixo(FormaGeometrica elemento) throws ElementoInexistenteException {
	if (elemento != null) {
		throw new ElementoInexistenteException("Elemento não existe");
	} else if (elemento != null) {
		for (FormaGeometrica formaGeometrica1 : this.formaGeometrica) {
			if (formaGeometrica1 == elemento) {
				Collections.swap((List<FormaGeometrica>) elemento, 0, 0);
			}
		}
		return true;
	}
	return false;
}
Edited by mirador_22
Link to comment
Share on other sites

A minha duvida é como selecionar um objeto dentro de Arraylist para que eu possa trocar com o próximo elemento se no caso quiser moverParaBaixo e trocar com o elemento anterior se no caso, moverParaCima.

Tens de ser mais claro do que isto.

O que queres fazer é, no caso de fazeres "mover para baixo" de um elemento, e este estiver no fim da lista, que seja trocado com o 1º elemento da lista?

  • Vote 1
Link to comment
Share on other sites

Tens de ser mais claro do que isto.

O que queres fazer é, no caso de fazeres "mover para baixo" de um elemento, e este estiver no fim da lista, que seja trocado com o 1º elemento da lista?

sim, acho que é assim, e também se tiver que mover que o ultimo elemento para cima, vai ser trocado com o elemento anterior

Link to comment
Share on other sites

sim, acho que é assim, e também se tiver que mover que o ultimo elemento para cima, vai ser trocado com o elemento anterior

Tens de ser mais claro do que isto.

O que queres fazer é, no caso de fazeres "mover para baixo" de um elemento, e este estiver no fim da lista, que seja trocado com o 1º elemento da lista?

Eu tenho este exemplo de como podemos trocar elementos Dentro de um arrayList

package estudo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Estudo {
public static void main(String[] args) throws Exception {
	// cria uma ArrayList que conterá strings
	List<String> figuras = new ArrayList<>();
	// adiciona itens na lista
	figuras.add("F1");
	figuras.add("F2");
	figuras.add("F3");
	figuras.add("F4");
	System.out.println("\n--- Lista de Figuras ---");
	for (String nome : figuras) {
		System.out.println(nome);
	}
	// Vamos trocar as posições dos 1º e 3º elementos
	System.out.print("\n--- Mover F2 para Cima ---");
	Estudo.moverParaCima(figuras);

	 // exibe os elementos da ArrayList
	System.out.println();
	for (String nome : figuras) {
		System.out.println(nome);
	}

	// Vamos trocar as posições dos 1º e 3º elementos
	System.out.print("\n--- Mover F3 para Baixo ---");
	Estudo.moverParaBaixo(figuras);
	// exibe os elementos da ArrayList
	System.out.println();
	for (String nome : figuras) {
		System.out.println(nome);
	}
	System.exit(0);
}
public static boolean moverParaCima(List<String> elemento) throws Exception {
	if (elemento == null) {
		throw new Exception("Elemento não existe");
	} else if (elemento != null) {
		Collections.swap(elemento, 0, 1);
		return true;
	}
	return false;
}


 public static boolean moverParaBaixo(List<String> elemento) throws Exception {
	if (elemento == null) {
		throw new Exception("Elemento não existe");
	} else if (elemento != null) {
		Collections.swap(elemento, 2, 3);
		return true;
	}
	return false;
}
}

e o output: é

--- Lista de Figuras ---

F1

F2

F3

F4

--- Mover F2 para Cima ---

F2

F1

F3

F4

--- Mover F3 para Baixo ---

F2

F1

F4

F3

A minha duvida é como selecionar um objeto dentro de Arraylist para que eu possa trocar com o próximo elemento se no caso quiser moverParaBaixo e trocar com o elemento anterior se no caso, moverParaCima.

mas num metodo com esta estrutura

public class FormaComposta {

private ArrayList<FormaGeometrica> formaGeometrica;

public FormaComposta() {
	this.formaGeometrica = new ArrayList<>();
}

/**
 * Troca de posição com o elemento imediato seguinte. O método poderá não
 * ser bem sucedido se o elemento de referência for o último.
 *
 * @param elemento elemento de referência para a troca
 * @return true se troca foi bem sucedida. false, c.c.
 * @throws ElementoInexistenteException se o elemento não existir
 */
@Override//DUVIDA AQUI
public boolean moverParaCima(FormaGeometrica elemento) throws ElementoInexistenteException {
	if (elemento != null) {
		throw new ElementoInexistenteException("Elemento não existe");
	} else if (elemento != null) {
		for (FormaGeometrica formaGeometrica1 : this.formaGeometrica) {
			if (formaGeometrica1 == elemento) {
				Collections.swap((List<FormaGeometrica>) elemento, 0, 0);
			}
		}
		return true;
	}
	return false;
}

/**
 * Troca de posição com o elemento imediato anterior. O método poderá não
 * ser bem sucedido se o elemento de referência for o primeiro.
 *
 * @param elemento elemento de referência para a troca
 * @return true se troca foi bem sucedida. false, c.c.
 * @throws ElementoInexistenteException se o elemento não existir
 */
@Override//DUVIDA AQUI
public boolean moverParaBaixo(FormaGeometrica elemento) throws ElementoInexistenteException {
	if (elemento != null) {
		throw new ElementoInexistenteException("Elemento não existe");
	} else if (elemento != null) {
		for (FormaGeometrica formaGeometrica1 : this.formaGeometrica) {
			if (formaGeometrica1 == elemento) {
				Collections.swap((List<FormaGeometrica>) elemento, 0, 0);
			}
		}
		return true;
	}
	return false;
}

consegui resolver e estão ambos a funcionar perfeitamente só que está lançando o erro java.lang.IndexOutOfBoundsException: Index: 2, Size: 2

public int buscarPosicaoFormaGeometrica(FormaGeometrica elemento) throws ElementoInexistenteException {
	if (elemento == null) {
		throw new ElementoInexistenteException("Elemento não existe");
	} else if (elemento != null) {
		for (FormaGeometrica formaGeometrica : this.formaGeometricas) {
			if (formaGeometrica.equals(elemento)) {
				return formaGeometricas.indexOf(elemento);
			}
		}
	}
	return 0;
}

/**
 * Troca de posição com o elemento imediato seguinte. O método poderá não
 * ser bem sucedido se o elemento de referência for o último.
 *
 * @param elemento elemento de referência para a troca
 * @return true se troca foi bem sucedida. false, c.c.
 * @throws ElementoInexistenteException se o elemento não existir
 */
@Override
public boolean moverParaCima(FormaGeometrica elemento) throws ElementoInexistenteException {
	if (elemento == null) {
		throw new ElementoInexistenteException("Elemento não existe");
	} else if (elemento != null) {
		int posicao = buscarPosicaoFormaGeometrica(elemento);
		Collections.swap(this.formaGeometricas, posicao, posicao + 1);
		return true;
	}
	return false;
}

/**
 * Troca de posição com o elemento imediato anterior. O método poderá não
 * ser bem sucedido se o elemento de referência for o primeiro.
 *
 * @param elemento elemento de referência para a troca
 * @return true se troca foi bem sucedida. false, c.c.
 * @throws ElementoInexistenteException se o elemento não existir
 */
@Override
public boolean moverParaBaixo(FormaGeometrica elemento) throws ElementoInexistenteException {
	if (elemento == null) {
		throw new ElementoInexistenteException("Elemento não existe");
	} else if (elemento != null) {
		int posicao = buscarPosicaoFormaGeometrica(elemento);
		if (posicao != 0) {
			Collections.swap(this.formaGeometricas, posicao, posicao - 1);
			return true;
		}
	}
	return false;
}
Edited by mirador_22
Link to comment
Share on other sites

O problema é estares a fazer posicao+1, ou posicao-1, sem ver se são valores válidos dentro da estrutura. Se quiseres uma estrutura circular, segue uma sugestão.

No caso do moverParaCima:

//...
Collections.swap(this.formaGeometricas, posicao, (posicao + 1) % this.formaGeometricas.size());
//...

E do moverParaBaixo:

//...
int novaPosicao = posicao-1;
if(novaPosicao < 0) novaPosicao = this.formaGeometricas.size()-1;
Collections.swap(this.formaGeometricas, posicao, novaPosicao);
//...
Edited by nhm
  • Vote 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.