Galera eu estava programando uma rotina que precisa buscar um conteudo string num array de objetos.
Todo sistema ja está feito e o metodo me retorna um array de objetos de aproximadamente 15 posiçoes.
Eu fiz de duas formas e gostaria de saber na opniao de voces qual é a melhor. A primeira foi a primeira que me ocorreu, iterei o array usando o velho amigo FOR e fiz um if ( “chave”.equals(MeuArray.get(x) ) …
E outra forma que me veio na cabeça foi fazer um get do array todo passando-o para um list e utilizar o metodo List.Contains(“chave”).
Gostaria de saber qual o melhor método e porque, na opnião de vocês.
Tente utilizar pesquisa binária, pois reduz em muito o tempo da busca. Por exemplo, um array com um bilhão de elementos iria precisar de apenas 30 comparações para encontrar o elemento necessário.
Se em vez de 15 fossem 30 ou mais dados, aconselharia que a rotina lhe retornasse um Set<String>.
Pode ser um HashSet (se você só quer procurar o dado) ou um TreeSet (se você quer que os dados venham ordenados “como brinde”). A busca é quase instantânea.
Na verdade não precisaria uma ordem específica, pois na busca binária, seria comparado o elemento do meio, caso este fosse maior que o elemento buscado, seria feita uma busca do meio para o início, do contrário, do meio para o final do array.
o método que retorna os 15 elementos, ele busca estes elementos em um banco de dados? Você não poderia passar o elementos desejado direto para que o método que gera o vetor retornar apenas os elementos que atendam a String?
Se a string for ser usada como chave para o objeto, pode ser mais interessando criar um HashMap<String,Objeto> em que a String a ser pesquisada é a chave para o mapa. Esta solução certamente é mais rápida que a pesquisa binária. Em tese O(1), contra o O(nlogn) da pesquisa binária.
o método que retorna os 15 elementos, ele busca estes elementos em um banco de dados? Você não poderia passar o elementos desejado direto para que o método que gera o vetor retornar apenas os elementos que atendam a String?
Se a string for ser usada como chave para o objeto, pode ser mais interessando criar um HashMap<String,Objeto> em que a String a ser pesquisada é a chave para o mapa. Esta solução certamente é mais rápida que a pesquisa binária. Em tese O(1), contra o O(nlogn) da pesquisa binária.
fw[/quote]
Então o método eu nao posso modificar pois ele já está sendo usado por outras estruturas e daria um trabalho imenso pra readaptar tudo.
Em um primeiro momento eu tentei a pesquisa binária mas nao tive muito sucesso, acho que por inexperiencie em utiliza-la, pois ela me retornava numeros negativos, e fiquei meio perdido em como faria a validação se existe ou nao o String que procuro no Array.
Então Yky por enquanto a aplicação está com um array mesmo, mas porque voce sugere o iterator e nao o contains ? ( se minha list fosse maior )
a) Se o array não vier ordenado, não se pode usar busca binária.
b) Se o array for pequeno (15 posições) e você for procurar apenas uma vez, faça a busca linear mesmo (for).
c) Se a busca for feita várias vezes nesse mesmo array, vale a pena você transferir os dados para um HashSet ou TreeSet, e usar o “contains”. Exemplo:
String[] resultado = bla.ble(bli); // seu método que retorna o array
Set<String> dados = new HashSet<String> (Arrays.asList (resultado));
System.out.println (dados.contains ("Joao")); // para ver se "Joao" está na lista. Retorna "true" ou "false".
É thingol eu deixei a busca linear mesmo. Valeu pelas dicas. Realmente o array nao vem ordenado e vai ter apenas 15 posições nao tem necessidade de complicar ainda mais o código.