[RESOLVIDO] Método de busca em um arraylist

Pessoal, estou a várias horas buscando um método de procurar dados no array…
Estou fazendo um programa de cadastro de hóspede onde o usuário insere o nome e o CPF, logo em seguida o programa oferece um “buscar” nele um digito o CPF, porém ao acessar o array buscando com esse parâmetro informado ele dá erro, sou novo no java por isso peço a compreensão de vocês. Obrigado (:

[code] public void buscaCliente() {
int busca = 0;

    System.out.println("Digite o CPF ou CNPJ do hóspede:");
    busca = entrada.nextInt();

    for (int i = 0; i < listaClientes.size(); i++) {
        if (listaClientes.contains(busca)) {

            System.out.println(listaClientes.get(busca));
        }
    }
}[/code]

Saída do programa:

run:
Nome:
Pedro
CPF ou CNPJ:
111
Deseja cadastrar outro Cliente?
s
Nome:
Joao
CPF ou CNPJ:
222
Deseja cadastrar outro Cliente?
n
Pedro
111
Joao
222
Digite o CPF ou CNPJ do hóspede:
111
Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 111, Size: 4
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at projetofinal_hotelplus.Clientes.buscaCliente(Clientes.java:64)
at projetofinal_hotelplus.PROJETOFINAL_HotelPlus.main(PROJETOFINAL_HotelPlus.java:23)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 11 segundos)

    System.out.println(listaClientes.get(busca));  

O método get od array busca por indíce e não por chave. Exemplo:

Digamos que um usuário digitou o CPF : 12345 vc foi e adicionou isto ao array,

 listaClientes.add(busca); 

Este valor foi adicionado no indíce 0 do array. O array só tem uma posição até então e você está tentando acessar a posição get(busca), onde busca é 12345.
Você está estourando o array, pois ele não possui valor algum neste indíce(12345).

Experimenta get(0).

ps: O mais aconselhável para o seu exemplo é um HashMap, pois dada uma chave ele consegue achar facilmente sem ter que percorrer toda a estrutura de dados.

Ola, sou novato também, então se escrever alguma bobeira…

1º o sua variável busca é do tipo inteiro,
2º busca recebe entrada.nextInt, //recebe um int, int é adequado para cpf e cnpj?
3º listaClientes.contains(busca), //contains usa Object como parâmetro, então, teoricamente recebe um int…
4º listaClientes.get(busca), //get retorna o elemento ocupado pelo índice, neste caso, busca…

Com os dados que vc passou, teoricamente está tudo correto.

ArrayList recebe elementos duplicados… e, até onde eu sei, não há erros de IndexOutOfBoundsException porque ele se se adeqüa à quantidade de elementos… então de onde vem IndexOutOfBoundsException?

Então fica complicado (pra mim) saber oque está acontecendo…

Mande o código de como vc definiu o ArrayList e as linhas do código que foram citadas nos erros (de preferência a linha citada, a anterior e a posterior)…

Cara, o array se adequa de tamanho conforme você vai inserindo elementos nele, porém, o erro de IndexBoundsException é quando você tenta acessar uma posição que não existe no array.

No caso dele, ele inseriu 4 cpfs no array e tentou acessar a posição 111(o ultimo cpf no caso), onde o array só possui 4.

veja:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 111, Size: 4 

[quote]xxMAGRAOxx
15/04/2013 04:49:24 Assunto: Re:Método de busca em um arraylist
view plaincopy to clipboardprint?
System.out.println(listaClientes.get(busca));

O método get od array busca por indíce e não por chave. Exemplo:

Digamos que um usuário digitou o CPF : 12345 vc foi e adicionou isto ao array,

view plaincopy to clipboardprint?
listaClientes.add(busca);

Este valor foi adicionado no indíce 0 do array. O array só tem uma posição até então e você está tentando acessar a posição get(busca), onde busca é 12345.
Você está estourando o array, pois ele não possui valor algum neste indíce(12345).

Experimenta get(0).

ps: O mais aconselhável para o seu exemplo é um HashMap, pois dada uma chave ele consegue achar facilmente sem ter que percorrer toda a estrutura de dados.
[/quote]

[size=15]Valeu a dica, mas é aí que está, não quero acessar o array utilizando um “índice” 0, 1, 2, 3, … Eu preciso é buscar pelo valor que está contido lá dentro… Estava adequando meu fonte para usar um HashMap como indicado, irei postar o código aqui…[/size]

[quote]NewScript
15/04/2013 10:06:15 Assunto: Re:Método de busca em um arraylist

Ola, sou novato também, então se escrever alguma bobeira…

1º o sua variável busca é do tipo inteiro,
2º busca recebe entrada.nextInt, //recebe um int, int é adequado para cpf e cnpj?
3º listaClientes.contains(busca), //contains usa Object como parâmetro, então, teoricamente recebe um int…
4º listaClientes.get(busca), //get retorna o elemento ocupado pelo índice, neste caso, busca…

Com os dados que vc passou, teoricamente está tudo correto.

ArrayList recebe elementos duplicados… e, até onde eu sei, não há erros de IndexOutOfBoundsException porque ele se se adeqüa à quantidade de elementos… então de onde vem IndexOutOfBoundsException?

Então fica complicado (pra mim) saber oque está acontecendo…

Mande o código de como vc definiu o ArrayList e as linhas do código que foram citadas nos erros (de preferência a linha citada, a anterior e a posterior)… [/quote]

[size=15]Isso, tipo INT, ainda não trabalhei muito bem o tipo de dados de entrada, no momento para testes o INT está me servindo, sendo que ao cadastrar um cpf uso geralmente 111, 222, 333 e assim vai, Isso, contains recebe o int “busca” como parâmetro… Mais acima está descrito o que realmente preciso, que é realizar uma busca não pelo índice de um array mas sim pelo seu valor contido lá dentro… entende?[/size]

[quote]xxMAGRAOxx
15/04/2013 15:40:22 Assunto: Re:Método de busca em um arraylist
ArrayList recebe elementos duplicados… e, até onde eu sei, não há erros de IndexOutOfBoundsException porque ele se se adeqüa à quantidade de elementos… então de onde vem IndexOutOfBoundsException?

Cara, o array se adequa de tamanho conforme você vai inserindo elementos nele, porém, o erro de IndexBoundsException é quando você tenta acessar uma posição que não existe no array.

No caso dele, ele inseriu 4 cpfs no array e tentou acessar a posição 111(o ultimo cpf no caso), onde o array só possui 4.

veja:

view plaincopy to clipboardprint?
Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 111, Size: 4
[/quote]

[size=15]Exatamente! Valeu por me descrever melhor esse erro![/size]

Não se esqueça que um CPF não cabe dentro de um int, já que tem 11 dígitos e um int tem no máximo 9 dígitos aproveitáveis (já que o décimo dígito só pode ser 0, 1 ou 2. )

Use um long ou uma String.

Pessoal mais uma ajuda eu peço a vocês…
Eu preciso retornar todos os registros do HashMap utilizando o iterator… Segue meu código até agora!

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package projetofinal_hotelplus;

/**
*

  • @author Pedro
    */
    import java.util.Scanner;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;

public class Clientes {

private static Scanner entrada = new Scanner(System.in);
//ArrayList listaClientes = new ArrayList();
private HashMap<Integer, Clientes> listaClientes;
private String nome;
private int cadastroNacional;

public Clientes(String nome, int cadastroNacional) {
    this.nome = nome;
    this.cadastroNacional = cadastroNacional;
}

public static Scanner getEntrada() {
    return entrada;
}

//public ArrayList getListaClientes() {
//  return listaClientes;
//}
public String getNome() {
    return nome;
}

public int getCadastroNacional() {
    return cadastroNacional;
}

public static void setEntrada(Scanner entrada) {
    Clientes.entrada = entrada;
}

// public void setListaClientes(ArrayList listaClientes) {
//    this.listaClientes = listaClientes;
// }
public void setNome(String nome) {
    this.nome = nome;
}

public void setCadastroNacional(int cadastroNacional) {
    this.cadastroNacional = cadastroNacional;
}

//Método de busca de hóspedes
public void buscaCliente() {

    System.out.println("Digite o CPF ou CNPJ do hóspede:");
    int busca = entrada.nextInt();
    System.out.println(listaClientes.get(busca).getNome());
}

public void mostraTodos() {

    String objeto;
    Iterator it = listaClientes.values().iterator();
    while (it.hasNext()) {
        objeto = (String) it.next();
        System.out.println(objeto);
    }




    //for (int i = 0; i < listaClientes.size(); i++) {
        //System.out.println(listaClientes.get(i));
    }
//}

//Método de cadastro de novo hóspede
public void cadastrarNovo() {
    String novo = null;
    listaClientes = new HashMap<Integer, Clientes>();

    do {
        System.out.println("Nome:");
        nome = entrada.next();
        //listaClientes.add(nome);

        System.out.println("CPF ou CNPJ:");
        cadastroNacional = entrada.nextInt();
        //listaClientes.add(cadastroNacional);

        Clientes hospede = new Clientes(nome, cadastroNacional);
        listaClientes.put(cadastroNacional, hospede);

        System.out.println("Deseja cadastrar outro Cliente?");
        novo = entrada.next();
    } while (novo.equals("S") || novo.equals("s"));

}

}
[/code]

Ali no método “mostraTodos”, esse pequeno trecho que está ali peguei da internet e apenas tentei adequá-lo porém sem sucesso… Aparece o seguinte erro ao compilar:

Exception in thread "main" java.lang.ClassCastException: projetofinal_hotelplus.Clientes cannot be cast to java.lang.String at projetofinal_hotelplus.Clientes.mostraTodos(Clientes.java:72) at projetofinal_hotelplus.PROJETOFINAL_HotelPlus.main(PROJETOFINAL_HotelPlus.java:28) Java Result: 1

Alguém pode ajudar? Valeu, ignorem as marcações “perdidas” no fonte kk

[quote=entanglement]Não se esqueça que um CPF não cabe dentro de um int, já que tem 11 dígitos e um int tem no máximo 9 dígitos aproveitáveis (já que o décimo dígito só pode ser 0, 1 ou 2. )

Use um long ou uma String. [/quote]

Sim, como eu disse mais acima, ainda não estudei o caso do tipo de valor, pois ao compilar uso geralmente 111 ou 222 e assim vai, mas obrigado por me indicar esses tipos de dados, aproveito pra te perguntar, o java tem um “char[11]” como no banco de dados?

Obrigado

Bom turma, cheguei no curso agora e falei com um colega a respeito e ele soube me indicar uma forma para buscar determinado valor dentro do HashMap… Segue o método de busca que utilizei!

[code]public void buscaCliente() {

    System.out.println("Digite o CPF ou CNPJ do hóspede:");
    String busca = entrada.next();

    Iterator it = listaClientes.values().iterator();
    System.out.println(listaClientes.get(busca));
}[/code]

Espero que possa ajudar o próximo! kk

Quanto ao método mostraTodos(), segue como ficou…
Deu certinho!

[code]public void mostraTodos() {

    Iterator it = listaClientes.values().iterator();

    while (it.hasNext()) {
        Clientes pTemp = (Clientes) it.next();
        System.out.println(pTemp);
    }[/code]