Buscar padrões de String

Amigos,
Como eu busco um padrão de String, mais ou menos igual o like no SQL.
Vejamos, tenho um ArrayList com vários nomes:

List<String> lista = new ArrayList<String>();
	lista.add("Ana");
	lista.add("Alice");
	lista.add("Brittany");
	lista.add("Bruna");
	lista.add("Cinderela");
	lista.add("Carla");
	lista.add("Diana");
	lista.add("Debora");
	lista.add("Eva");
	lista.add("Fiona");
	lista.add("Gunda");
	lista.add("Helena");
	lista.add("Hege");
	lista.add("Inga");
	lista.add("Iandra");
	lista.add("Johanna");
	lista.add("Karine");
	lista.add("Kitty");
	lista.add("Linda");
	lista.add("Nina");
	lista.add("Ophelia");
	lista.add("Petunia");
	lista.add("Raquel");
	lista.add("Sunniva");
	lista.add("Tove");
	lista.add("Violet");

Quando o usuário digitar “a” o ArrayList devolve “Anna” e “Alice”. Logo em seguida ele digita “n” e devolve somente “Anna”.
Aqui chega o momento que estagnei.
Tentei:

for(int i = 0; i < lista.size(); i++)
	{
		if(lista.contains(nome))
		{
			return nome;
		}
	}

ou mesmo lista.equals(nome);
Como eu faria algo como lista.contains(a%), tipo o like do SQL.
Valeu.

Você pode usar o .startsWith() pra isso.

o contains vai te ajudar com isso

for(String nome : lista) {
		if(nome.contains("an")) {
			return nome;
		}
	}

Fiz a seguinte classe:

import java.util.ArrayList;
import java.util.List;

public class ObterDicas 
{	
	public String ObterDica(String nome)
	{		
		List<String> lista = new ArrayList<String>();
		lista.add("Ana");
		lista.add("Alice");
		lista.add("Brittany");
		lista.add("Bruna");
		lista.add("Cinderela");
		lista.add("Carla");
		lista.add("Diana");
		lista.add("Debora");
		lista.add("Eva");
		lista.add("Fiona");
		lista.add("Gunda");
		lista.add("Helena");
		lista.add("Hege");
		lista.add("Inga");
		lista.add("Iandra");
		lista.add("Johanna");
		lista.add("Karine");
		lista.add("Kitty");
		lista.add("Linda");
		lista.add("Nina");
		lista.add("Ophelia");
		lista.add("Petunia");
		lista.add("Raquel");
		lista.add("Sunniva");
		lista.add("Tove");
		lista.add("Violet");
		
		for(String retorno : lista)
		{
			if(lista.contains(nome))
			{
				return retorno;
			}
		}
	
		return null;
	}
}

Nesse caso, me retorna somente se eu digitar o nome completo, ou seja, se eu digitar “An” não me volta “Ana”. Para me voltar “Ana” tenho que digitar completamente “Ana”.

pq vc ta fazendo lista.contains(nome)… faca if (retorno.contains(nome)) igual fiz no comentario acima. Lembrando que como vc ta colocando return, ele vai pegar o primeiro e vai sair do metodo. Faça um System.out.println pra ver todos resultados

Veja essa estrutura de dados:

Mudei para a seguinte maneira:

import java.util.ArrayList;
import java.util.List;

public class ObterDicas 
{	
	public List<String> ObterDica(String nome)
	{		
		List<String> lista = new ArrayList<String>();
		lista.add("Ana");
		lista.add("Alice");
		lista.add("Brittany");
		lista.add("Bruna");
		lista.add("Cinderela");
		lista.add("Carla");
		lista.add("Diana");
		lista.add("Debora");
		lista.add("Eva");
		lista.add("Fiona");
		lista.add("Gunda");
		lista.add("Helena");
		lista.add("Hege");
		lista.add("Inga");
		lista.add("Iandra");
		lista.add("Johanna");
		lista.add("Karine");
		lista.add("Kitty");
		lista.add("Linda");
		lista.add("Nina");
		lista.add("Nicole");
		lista.add("Ophelia");
		lista.add("Petunia");
		lista.add("Raquel");
		lista.add("Sunniva");
		lista.add("Tove");
		lista.add("Violet");
		
		List<String> listaRetorno = new ArrayList<>();
		
		for(String retorno : lista)
		{
			if(retorno.contains(nome))
			{
				listaRetorno.add(retorno);
				return listaRetorno;
			}
		}
		return null;
	}
}

Coloquei meu retorno como uma list, assim ele retorna tudo dentro da lista.
Mas ficou 50% do quê eu quero.
Agora quando eu digito “a” ele me volta “Ana”, mas “Alice” ainda não.
Me surgiu outra questão. Como eu faço para ele comparar independentemente de ser caixa alta ou baixa?

Ele ta retornando apenas um resultado, pq vc ta dando o retorno dentro do “for”, igual eu disse acima também :slight_smile:

tira esse return dentro do if, e no final do método retorna o listaRetorno.

Sobre ignorar o case, acho que não existe um containsIgnoreCase, entao uma solução seria colocar as duas Strings em lowerCase, ou upperCase na comparacao

if (retorno.toLowerCase().contains(nome.toLowerCase())

1 curtida

Você pode converter tudo para uppercase:

List<String> listaRetorno = new ArrayList<>();
		
for(String retorno : lista){
   if(retorno.toUpperCase().startsWith(nome.toUpperCase())){
      listaRetorno.add(retorno);
   }
}