binarySearch[RESOLVIDO]

10 respostas
evertonsilvagomesjav

Pessoal, quando eu ordeno um array, por exemplo, com um comparator, na hora de usar o binarySearch eu preciso passar o comparator também para obter o resultado satisfatorio. Agora se eu nao passo o comparator, me retorna um numero inesparado como “-1” por exemplo.

Tenho feitos alguns exercicios e nos exercicios contém um retorno como -1, -5 e -3. Eu escolho uma resposta com o retorno de -1 pois no livro da Kathy fala que “normalmente” é -1. Porém a resposta era -5. Tem algum critério para usar, para saber qual numero negativo o binarySearch vai retornar?

10 Respostas

E

Se você usar errado o binarySearch, ele vai lhe retornar um número indefinido. Por exemplo, se você não passar o mesmo comparator na hora de ordenar e de procurar, vai lhe retornar um número incorreto.

Se você usar adequadamente o binarySearch, ele lhe retorna exatamente o que está escrito na documentação - a posição onde você acharia o valor, se ele estivesse nesse vetor, mais um, e então multiplicada por -1.

E

Para você entender melhor.

import java.util.Arrays;

class TesteBinarySearch {
    public static void main (String[] args) {
        int[] dados = {1, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
        int pos;
        pos = Arrays.binarySearch (dados, 2);
        System.out.println (pos); // -2 porque se estivesse no vetor, ficaria em dados[1]. 1 + 1 = 2
        pos = Arrays.binarySearch (dados, 4);
        System.out.println (pos); // -3
        pos = Arrays.binarySearch (dados, 9);
        System.out.println (pos); // -5
        pos = Arrays.binarySearch (dados, 15);
        System.out.println (pos); // -7
        pos = Arrays.binarySearch (dados, 18);
        System.out.println (pos); // -8
    }
}
ViniGodoy

Sempre leia com a atenção a documentação. E por documentação, dizemos o javadoc e as especificações da VM, não o livro da Kathy.

evertonsilvagomesjav

Nó entanglement, explicação perfeita cara, brigadão!

Vini, vou ler mais atentamente a documentação :thumbup:

evertonsilvagomesjav

Cara fiz o teste aqui pra ver, mas nao deu certo:

static class Compara implements Comparator<String>{

		@Override
		public int compare(String arg0, String arg1) {
			// TODO Auto-generated method stub
			return arg1.compareTo(arg0);
		}
		
		
		
	}
	
	public static void main(String[] args) throws MyException, FileNotFoundException, IOException {
				
		String[] dados = {"map", "pen", "marble", "key"};
		
		Compara comp = new Compara();
		
		Arrays.sort(dados, comp);
		
		for(String n : dados){
			System.out.println(n);
		}
		
		
		System.out.println(Arrays.binarySearch(dados, "map")); //imprime -1.

Era pra imprimir -3 não? Pois map ordenado inversamente ficaria na posição dados[2], +1 * -1 = -3. Não seria isso?

E

Quando você usa um comparador diferente no sort e no binarySearch, o resultado do binarySearch é indefinido.

evertonsilvagomesjav

entanglement:
Quando você usa um comparador diferente no sort e no binarySearch, o resultado do binarySearch é indefinido.

Se você usar errado o binarySearch, ele vai lhe retornar um número indefinido. Por exemplo, se você não passar o mesmo comparator na hora de ordenar e de procurar, vai lhe retornar um número incorreto.

Se você usar adequadamente o binarySearch, ele lhe retorna exatamente o que está escrito na documentação - a posição onde você acharia o valor, se ele estivesse nesse vetor, mais um, e então multiplicada por -1.

Nó kkk, vlw de novo!!!

Gustavo_Santos

Bom, eu fiquei com uma dúvida agora, porque se eu trocar a ordem aqui assim :

return arg0.compareTo(arg1);

Mesmo não passando o Comparator, ele retorna 1. Tipo classifiquei com um comparator e não passai o comparator na hora da pesquisa,
tinha que ter retornado um valor inconsistente não ?!

public class TesteComparator {

	public static void main(String[] args) {
		 
		String[] dados = {"map", "pen", "marble", "key"};
		Comparando c = new Comparando();
		
		Arrays.sort(dados, c);
		
		for(String s : dados) {
			System.out.println(s);
		}
		System.out.println(Arrays.binarySearch(dados, "map"));
	}
	
	static class Comparando implements Comparator<String> {
		@Override
		public int compare(String arg0, String arg1) {
			return arg0.compareTo(arg1);
		}
	}
}
Gustavo_Santos

Pessoal o que de fato acontece aqui ?!

return arg0.compareTo(arg1);  // dessa forma ele entraria na posição (3 + 1) * -1 = -4
return arg1.compareTo(arg0); // porque assim ele retorna -5
ViniGodoy

Quando você usa o binary search num comparable, ele leva em consideração a ordem do comparable. Como a do String (que é um Comparable) é idêntica a do seu comparador, deu certo.

Criado 20 de agosto de 2010
Ultima resposta 21 de ago. de 2010
Respostas 10
Participantes 4