Busca no ArrayList

20 respostas
B

boa tarde galera estou com um probleminha em um arraylist

no araylist insiro objetos Contas, na qual possuem nº da conta, senha e saldo, na hora q preciso busca eles, eu preciso q seje pelo num da conta, ai que esta meu problema

o usuario informa o num da conta que quer acessar, porem meu codigo não executa a busca e também não mostra erro.

String contaCons;
					int opcOp;
					contaCons = JOptionPane.showInputDialog(null,"Qual conta deseja consultar?");
					ContaBancaria cb;
					for(int ind=0; i < conta.size();ind++){//Percorrer o array
						cb = conta.get(ind);
						if(cb.getNumConta().equals(contaCons)){//acredito que o erro esteje aqui
							//if(cb.equals("cc")){//verifica se e CC ou CP
								opcOp = Integer.parseInt(JOptionPane.showInputDialog(null,
																	"1 - Saque" +
																	"\n 2 - Deposito" +
																	"\n 3 - Extrato" +
																	"\n 4 - Alterar senha"));
                                                  }
                                           }

20 Respostas

Mephy

o que é ind e o que é i?
acho que você errou o nome da variável ‘-’

B

caramba passei a tarde procurando erro nessa parte e nem notei isso, agora rodou certinho, vlw

Mephy

Benmaluco:

caramba passei a tarde procurando erro nessa parte e nem notei isso, agora rodou certinho, vlw

de nada n.n

diegogeovani

Aproveitando que o tópico é sobre Buscas usando a classe ArrayList, eu tenho um dúvida quanto a isso: quero que o meu programa simplismente retorne o número de vezes que um deterninado valor do objeto 'String nome' aparece em uma lista:

ArrayList<String> listaPessoa = new ArrayList<String>();
	
		listaPessoa.add("diego");
		listaPessoa.add("renato");
		listaPessoa.add("leonardo");
		listaPessoa.add("livia");
		listaPessoa.add("sandro");
		listaPessoa.add("diego");
		listaPessoa.add("diego");
		listaPessoa.add("diego");
		listaPessoa.add("diego");
		listaPessoa.add("renato");
		listaPessoa.add("diego");
		listaPessoa.add("sandro");
		listaPessoa.add("diego");
		listaPessoa.add("livia");
		listaPessoa.add("livia");
		
		String nome = JOptionPane.showInputDialog(null,"Digite seu nome:","Java",1);

Vamos supor que eu digite "renato". O programa terá que retornar que o nome digitado("renato") aparece 2 vezes na lista. Então, como eu posso estar colocando em prática esta lógica? Qual é o melhor método?

manolimars

Ficaria mais ou menos assim:

cria um método que recebe como parâmetro a String a ser procurada e retorne um Int.

inicia uma variável Int “quantidade” com valor zero.

faz um loop para percorrer todas as posiçoes do array

a cada volta no loop faz uma verificação,“se existe o nome a ser procurado nesta posição, incrementa a variável quantidade”

após percorrer todas as posições do array, dá um return na variável quantidade.

diegogeovani

manolimars:
Ficaria mais ou menos assim:

cria um método que recebe como parâmetro a String a ser procurada e retorne um Int.

inicia uma variável Int “quantidade” com valor zero.

faz um loop para percorrer todas as posiçoes do array

a cada volta no loop faz uma verificação,“se existe o nome a ser procurado nesta posição, incrementa a variável quantidade”

após percorrer todas as posições do array, dá um return na variável quantidade.

Obrigado manolimars. Vou tentar implementar isto. Depois eu posto a resposta.

regis_hideki
diegogeovani:
Aproveitando que o tópico é sobre Buscas usando a classe ArrayList, eu tenho um dúvida quanto a isso: quero que o meu programa simplismente retorne o número de vezes que um deterninado valor do objeto 'String nome' aparece em uma lista:
ArrayList<String> listaPessoa = new ArrayList<String>();
	
		listaPessoa.add("diego");
		listaPessoa.add("renato");
		listaPessoa.add("leonardo");
		listaPessoa.add("livia");
		listaPessoa.add("sandro");
		listaPessoa.add("diego");
		listaPessoa.add("diego");
		listaPessoa.add("diego");
		listaPessoa.add("diego");
		listaPessoa.add("renato");
		listaPessoa.add("diego");
		listaPessoa.add("sandro");
		listaPessoa.add("diego");
		listaPessoa.add("livia");
		listaPessoa.add("livia");
		
		String nome = JOptionPane.showInputDialog(null,"Digite seu nome:","Java",1);

Vamos supor que eu digite "renato". O programa terá que retornar que o nome digitado("renato") aparece 2 vezes na lista. Então, como eu posso estar colocando em prática esta lógica? Qual é o melhor método?

Tem um método na classe Collections que faz isso. Se não me engano, ficaria algo como: Collections.frequency(Collection<T> c, Object o)

diegogeovani

manolimars, tentei implementar a partir da lógica que você postou anteriormente. regis_hideki, olhei no javadoc sobre a classe Collections, mas não consegui assimilar nada,
nem mesmo com referência a esse tal de Collections.frequency(Collection<T> c, Object o). Por isso tentei implementar do jeito que eu sei:

public class Pessoas {
	
	public static void main(String[] args) {
		
		ArrayList<String> listaPessoa = new ArrayList<String>();
		
			
		listaPessoa.add("diego");
		listaPessoa.add("renato");
		listaPessoa.add("leonardo");
		listaPessoa.add("livia");
		listaPessoa.add("sandro");
		listaPessoa.add("diego");
		listaPessoa.add("diego");
		listaPessoa.add("diego");
		listaPessoa.add("diego");
		listaPessoa.add("renato");
		listaPessoa.add("diego");
		listaPessoa.add("sandro");
		listaPessoa.add("diego");
		listaPessoa.add("livia");
		listaPessoa.add("livia");
		
		String nome = JOptionPane.showInputDialog(null,"Digite um nome:","Java",1);
		
		System.out.println(procurarNome(listaPessoa, nome));
			
	}
	
	public static int procurarNome(ArrayList<String> listaPessoa, String nome) {
		
		int quantidade = 0;
		//o teste pra verificar se o nome digitado existe na lista é válido
		if(! listaPessoa.contains(nome)) {
			
			System.out.println("O nome não existe!");
			
		}else{
			//acredito que a estrutura abaixo percorra toda a lista
			for(int contador = 0; contador < listaPessoa.size(); contador++) { 
				//a partir daqui, não consegui implementar como capturar só o nome digitado
			}
			
		}
		
		return quantidade;
		
	}
	
}

E foi isso. não consegui fazer ainda. Se alguém puder postar um código pra me dar uma luz, ou até mesmo uma ideia melhor ou crítica sobre o método que eu estou utilizando
, eu agradeço :D
Agradeço a atenção da galera deste tópico também!

ViniGodoy
Basta somar tudo usando um map:
Map<String, Integer> map = new TreeMap<String, Integer>();
for (String nome : listaPessoa) {
   if (!map.contains(nome)) {
      map.put(nome, 0);
   map.put(nome, map.get(nome) + 1);
}

for (Map.Entry<String, Integer> entry : map.entrySet()) {
   System.out.printf("%s aparece %d vezes", entry.getKey(), entry.getValue();
}
regis_hideki

você pode colocar dentro do seu for:

if(listaPessoa.get(contador).equals(nome)){ quantidade++; }

ou, usando Collections, seu método ficaria bem simples:

public static int procurarNome(ArrayList<String> listaPessoa, String nome) { return Collections.frequency(listaPessoa, nome); }

ViniGodoy

O frequency é interessante se vc for usar essa informação uma vez só.

O map que sugeri é bom caso você precise da informação várias vezes, ou precise totalizar todos os elementos dentro da lista. No fundo, ele faz o que o frequency faz, para todos os elementos da lista de uma só vez.

claudneto

Usando o que vc mesmo criou, vc coloca um if com a condição de achar o nome, somar no quatidade:

for(int contador = 0; contador < listaPessoa.size(); contador++) {   
                //a partir daqui, não consegui implementar como capturar só o nome digitado  

                if (listaPessoa.get(contador).compareTo("String que vc queira comparar") == 0) {
                    quatidade++;
                }
            }
diegogeovani

Valeu mesmo gente, vou tentar implementar todos esses metodos possíveis. Quando eu puder, eu posto a resposta.
Abraço.

diegogeovani

Estou tendo outro problema. Primeiro, tenho essa classe:

public class Lista {
		
	ArrayList<String> lista;
	
	public void preencherLista() {
		
		ArrayList<String> lista = new ArrayList<String>();
			
		lista.add("a"); lista.add("a"); lista.add("a"); lista.add("a");
		lista.add("b"); lista.add("b"); lista.add("b"); lista.add("b");
		lista.add("b"); lista.add("b"); lista.add("b"); lista.add("c");
		lista.add("c"); lista.add("c"); lista.add("d");	
					
	}

	public void setLista(ArrayList<String> lista) {
		this.lista = lista;
	}

	public ArrayList<String> getLista() {
		return lista;
	}	

}

Depois, em outra classe, há o método abaixo:

public String buscar() {
		
		Lista lista = new Lista();
		
		if(lista.getLista().isEmpty()){
			return "Deu merda!";

		}else{		
		     return  "Há itens na lista";
		}
	}

E por último, quando executado o método “buscar()” o programa dispara a exceção “NullPointerException”. Pelo o que entendi do Console do Eclipse, o erro ocorre na linha if(lista.getLista().isEmpty())
Então, a lista está vazia(null)? Os métodos “get” & “set” fazem sentido, se tratando de uma coleção String? Como capturar, através do objeto :“Lista”, os elementos inseridos nela?

Obrigado pela paciência de todos! :smiley:

ViniGodoy

E porque não deveria dar? Você criou uma nova lista, não chamou o setLista e já chamou o getLista direto.

Se não quer que dê null pointer, você precisa criar uma lista, mesmo que vazia:
public class Lista {		
	List<String> lista = new ArrayList<String>();	

	public void preencherLista() {
		lista.add("a"); lista.add("a"); lista.add("a"); lista.add("a");
		lista.add("b"); lista.add("b"); lista.add("b"); lista.add("b");
		lista.add("b"); lista.add("b"); lista.add("b"); lista.add("c");
		lista.add("c"); lista.add("c"); lista.add("d");	
	}

	public void setLista(ArrayList<String> lista) {
		this.lista = lista;
	}

	public List<String> getLista() {
		return lista;
	}	
}
diegogeovani
Realmente ViniGodoy! Escrevi a linha "List<String> lista = new ArrayList<String>();" fora do método "preencherLista()", e o programa não disparou a exceção. Entretanto, no teste
if(lista.getLista().isEmpty()){  
        return "Vazio!";  
  
    }else{        
         return  "Há itens na lista";  
    }
o retorno foi "vazio!". Testando, declarei o objeto "lista" como static, alterando os modos de acesso. Aí sim, o retorno foi "Há itens na lista". Está aí minha dúvida: por que como static o retorno foi outro? Nunca conseguir entender plenamente esse conceito! Valeu o apoio mano!
ViniGodoy

Você retirou a segunda declaração da lista de dentro do método preencherLista como eu fiz?

Pq senão, vc terá duas listas com o mesmo nome. Uma dentro do método, outra fora.
Preencher a de dentro não fará com que a de fora fique preenchida.

diegogeovani

Agora entendi, ViniGodoy. Enfim, verifiquei as soluções que o pessoal postou aqui. Não consegui entender a classe Map e sua lógica, mas vou estudar mais a frente. O método Collections.frequency() faz exatamente o que eu questionei anteriormente: retorna o número de elementos existentes em uma coleção, que sejam iguais ao objeto em questão. É um código de alto nível, mas eu entendi também como funciona a contagem, o que mais importa. Valeu mesmo pessoal. 8)

acbit

.

zicky23

Estou com um problema em relação a busca no arraylist, espero que vcs me deem uma luz

carreguei os dados em uma arraylist do db.

ai no FieldPesquisakeyreleased qro q ao digitar uma letra ele percorra o arraylist e vá encontrando a linha q tenha o q digitei... e vá selecionando em uma JTable. tem como?

segue a arraylist

//aki quero q cada vez que eu digitar uma letra gostaria que fosse selecionando uma linha, mas não ta funcionando.    
    
    private void FieldPesquisaKeyReleased(java.awt.event.KeyEvent evt) {                                              
        // TODO add your handling code here:    
    
        String pesquisa = FieldPesquisa.getText();    
        List<Servicos> resultados = new ArrayList<Servicos>();    
        for (Servicos p : lista2) {    
            if (p.getNomeContrib().startsWith(pesquisa)) {    
                resultados.add(p);    
            }    
        }    
}

ou isso

private void FieldPesquisaKeyReleased(java.awt.event.KeyEvent evt) {                                            
        // TODO add your handling code here:  
  
        ArrayList resultado = new ArrayList();  
  
        for (Iterator iter = lista2.iterator(); iter.hasNext();) {  
            Servicos s1 = (Servicos) iter.next();  
            if (s1.getNomeContrib().equals(s1.getNomeContrib())) {  
                resultado.add(s1);  
            }  
           }  
}

como implemento isso para mostrar os resultados na JTABLE????

valeu

Criado 10 de abril de 2011
Ultima resposta 2 de mai. de 2012
Respostas 20
Participantes 9