mirador_22 Posted June 24, 2014 Report Share Posted June 24, 2014 (edited) 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 June 24, 2014 by mirador_22 Link to comment Share on other sites More sharing options...
nhm Posted June 24, 2014 Report Share Posted June 24, 2014 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? 1 Report Link to comment Share on other sites More sharing options...
mirador_22 Posted June 24, 2014 Author Report Share Posted June 24, 2014 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 More sharing options...
mirador_22 Posted June 24, 2014 Author Report Share Posted June 24, 2014 (edited) 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 June 24, 2014 by mirador_22 Link to comment Share on other sites More sharing options...
nhm Posted June 24, 2014 Report Share Posted June 24, 2014 (edited) 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 June 24, 2014 by nhm 1 Report Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now