Como achar um dado no vetor?

Olá!
Possuo um vetor:

String[] nome = new String [3];

Até aí ok, consigo colocar os dados no vetor, agora preciso fazer um método de pesquisa, onde a pessoa digita um nome que ela deseja pesquisar. O nome de pesquisa é salvo na variável

String nomeP;

Fiz da seguinte forma:

if(menu == 1){     
        System.out.println("Digite o nome do hóspede que deseja cadastrar: ");
        nome[i] = entrada.nextLine();

        }else if(menu == 2){
        System.out.println("Digite o nome do hóspede que deseja pesquisar: ");
        nomeP = entrada.nextLine();

E então o programa vá em cada índice procurar o nome e retorná-lo, caso encontre. Como fazer?

Utilize um FOR para percorrer esse array, e então quando você encontrar a posição que possui o nome que tu procura tu trabalha com ela… seria algo como

for(int 1 = 0; i < nome.size(); i++){
     String nome = nome[i];
     if(nome.equals(teuNomeAqui)){
        O que deseja fazer
     }
}

A lógica seria essa a principio.

Obs: Não lembro se pra arrays é size() ou length();

1 curtida

Obrigado pela ajuda!
Meu código ficou assim:

        if(menu == 2){
            System.out.println("Digite o nome do hóspede que deseja pesquisar: ");
            nomeP = entrada.nextLine();

        for(i = 0; i < nome.length; i++){
                 if(!nomeP.equals(nome[i])){
                     System.out.println("Hóspede não encontrado!\n");
            }else{
                System.out.println("Hóspede " + nome[i] + " encontrado no índice " + i + "!\n");                  
              }
            }   

Só tem um problema, quando eu rodo o código, acontece isso:
codigo erro

Como fazer só aparecer uma vez? Se encontrado, aparecer apenas a mensagem que encontrou, se não encontrou, aparecer apenas a mensagem de que não encontrou.

Utilize um um Break; no else, assim quando ele encontrar algo ele sai do laço de repetição. Além disso ao meu ver se tu alterar esse if(!nomeP.equals(nome[i])) e mudar para if(nomeP.equals(nome[i])) e então somente mostrar a mensagem quando encontrar o objeto que você procura parece mais correto

1 curtida

Pelo jeito vc já conseguiu resolver, mas considere praticar outras abordagens.

Como usar um método. Assim vc conseguirá reaproveitar em outros pontos do código:

public int verificarIndice(String nome, String[] nomes) {
    for (int i = 0; i < nome.length; i++) {
        if (nome.toLowerCase().equals(nome[i].toLowerCase())) {
        return (i+1);
    }

    return -1;
}

E para usar:

String nome = "Teste";
int index = verificarIndice("Teste", nomes)

if (index == -1) {
    System.out.println("Hóspede não encontrado!\n");
} else {
    System.out.println("Hóspede " + nome + " encontrado no índice " + index + "!\n");
}
1 curtida

Em vez disso, eu acho mais simples assim:

if (nome.equalsIgnoreCase(nomes[i]))

Não só porque fica mais sucinto e - na minha opinião - mais legível, mas também porque acaba sendo mais otimizado.

Ao chamar toLowerCase(), vc acaba gerando uma nova string (então nesse caso, são geradas duas strings), e só depois começa a ser feita a comparação entre elas. Já equalsIgnoreCase começa fazendo a comparação caractere a caractere, e já retorna false assim que encontra alguma diferença (e se não encontrar, ainda sim é melhor porque não precisou gerar strings extras).

Claro que para códigos com poucas comparações, a diferença será irrelevante, mas ainda sim, eu prefiro usar equalsIgnoreCase. Até porque tem outros casos em que pode dar diferença. Ex:

String s1 = "I";
String s2 = "İ";
System.out.println(s1.toLowerCase().equals(s2.toLowerCase())); // false
System.out.println(s1.equalsIgnoreCase(s2)); // true

No caso, a string s1 tem o caractere I (a letra “i” maiúscula), mas s2 tem o caractere İ (é uma letra “i” com um “pinguinho” em cima), que é outro caractere, diferente do “I” maiúsculo.

Apesar disso, equalsIgnoreCase considera que são iguais, por motivos de “Unicode contém várias dessas bizarrices:slight_smile:

Se quiser saber porque dá diferença, é porque a versão lowercase delas de fato é diferente. Basta imprimir os code points de cada uma:

String s1 = "I";
String s2 = "İ";
System.out.println("s1:");
s1.toLowerCase().codePoints().forEach(c -> System.out.printf("%06X\n", c));
System.out.println("s2:");
s2.toLowerCase().codePoints().forEach(c -> System.out.printf("%06X\n", c));

A saída é:

s1:
000069
s2:
000069
000307

Isso mesmo, s2.toLowerCase() retorna uma string com dois code points (inclusive, s2.toLowerCase().length() é 2).

E esse não é o único caso, letras gregas como ϴ e ϑ também dão o mesmo resultado (equals com toLowerCase retorna false, mas equalsIgnoreCase retorna true).

Claro que se tiver apenas textos em português, esses problemas não ocorrem. Mas ainda sim, usar equalsIgnoreCase, além de deixar - na minha opinião - mais claro e sucinto, ainda evita criar duas strings à toa (e na verdade vai criar bem mais, já que isso está dentro de um loop).

2 curtidas

Tem razão @hugokotsubo, fui fazendo num bloco aqui e nem lembrei do ignore case.

1 curtida

Valeu pela ajuda, pessoal!