binarySearch (Simples)

24 respostas
anderson.bonavides

Galéra to com uma seguinte dúvida simples. O método binarySearch retorna uma posição do array. Caso não exista a posição ele retornará a posição que será inserida. O método para encontrar a posição que será inerida é (-(pos)-1). Em um array de 5 posições ele retornará -6, em um array de 4 posições ele retornará -5.
O que ha de errado?

import java.util.Arrays;

public class Search {
	public static void main(String[] args) {
		int[] numbers = {1,2,4,5,7};
		System.out.println(Arrays.binarySearch(numbers, 6));
	}
}

24 Respostas

Raff

como assim o que há errado ? a saída é -5 nesse caso !

anderson.bonavides

Ahh desculpa acabei não completando. Quando tentei determinar a saída eu disse que era -6. Por que deu errado?

Raff

vamos contar juntos huauhahu
{1,2,4,5,7}
0 1 2 3 4 o número 6 deveria ser inserido aqui (por isso o nome ponto de inserção) então quando fazemos Arrays.binarySearch(numbers, 6); não existe o seis mais onde ele deveria se colocado é na posição 4. Dai faz a - 4 - 1 = -5 :slight_smile: espero ter ajudado !!!

Raff

{1,2,4,5,7} só para arrumar os indices!!
{0,1,2,3,4}

Raff

qualquer dúvida só gritar!

anderson.bonavides

Compilando e testando verifiquei com base no que vc me explicou e continuo com a dúvida. Se eu alterar meu array para:

A saída será -4. Pelo o que vc explicou não seria -3?

Raff

isso é por que o array não está ordenado
sendo assim a saída não é previsivel !!!

Raff

agora se você fazer assim

Arrays.binarySearch(inter, 3);//onde o 3 deveria estar ?.. devia estar no 1 então retornará -1 - 1 = -2 :smiley: espero ter ajudado !

Raff

tipo anderson quando o vetor estiver desordenado retornará um valor imprevissivel … (note isso !)

anderson.bonavides

Ralf eu não sei pq mas tentei ordenar o array utilizando Arrays.sort(numbers); e a saída não foi legal continuou a mesma saída.

:roll:

Raff

coloca seu código aqui para mim ver como está !!!

anderson.bonavides

Agora saiu!

Reeeeee

Vlw Ralf pela força!

:smiley:

Raff

era para funcionar :slight_smile:

int[] a = new int[]{1,5,4}; Arrays.sort(a); System.out.println(Arrays.binarySearch(3));
a saida é -2! como deveria seer :slight_smile:

anderson.bonavides

Com esse anterior não ocorre!

O erro tinha acontecido com esse código.

int[] numbers = {1,5,4};

Arrays.sort(numbers);

System.out.println(Arrays.binarySearch(numbers, 6));

Quer dizer ainda acontece! O resultado é -4.

Raff

sim por que ele teria que estar no indice 3 dai -1 - 3 = -4 :slight_smile: !

anderson.bonavides

Só mais uma coisa para encerrrar. É possível sobrescrever o método Arrays.sort()?

int[] numbers = {2,4,7,1,2,4,5}; Arrays.sort(numbers, new Comparator<Integer>() { public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); } });

A compilação apresenta erro. Mas por se tratar de um método fiquei na dúvida se é possivel sobrescrever! Obs: ele não é final. Mas é statico isso tem haver?

anderson.bonavides

Ralf Sobre o método binarySearch ficou exclarecido. Desde já agradeço.

Raff

cara você quer sobrescrever o metodo sort… ou sobrecarregalo ? se for sobrescrever faz uma classe que extends Arrays… e sobrescreva o metodo…(não sei para que você faria isso mas…) !!!

Raff

e outra ele sendo um metodo static não existe sobrecrição de metodo estático… o polimorfismo não funciona!!!

anderson.bonavides

Ahh ta o método sort é estático então ai está o erro.

:wink:

B

Seguindo o mesmo assunto fiquei um pouco com dúvida nessa

package colecoes;

import java.util.Arrays;

public class Tester2{
public static void main(String[] args) {

String[] arr = { "java", "champ", "champion" };
	Arrays.sort(arr);
	
	for (int i = 0; i < arr.length; i++) {
		System.out.println("["+ i +"] = "+ arr[i]);
	}
	System.out.print(Arrays.binarySearch(arr, "champion"));
	System.out.print(Arrays.binarySearch(arr, "You"));
	
}

}
Entendi que o vetor foi ordenado e que o champion ficou na posição 1
agora não entendi porque o you retornou -1

não entendi porque a saída foi 1-1

ribclauport

Por favor coloque seu código entre as tags code!

Quanto ao código veja, é so mudar o codigo e adicionar a String, vai ver que ela seria inserida na primeira posição do array veja:

import java.util.Arrays;

public class Search {
	public static void main(String[] args) {

		String[] arr = { &quot;java&quot;, &quot;champ&quot;, &quot;champion&quot;,&quot;You&quot;,&quot;acx&quot;};
		Arrays.sort(arr);

		for (int i = 0; i &lt; arr.length; i++) {
			System.out.println(&quot;[&quot; + i + &quot;] = &quot; + arr[i]);
		}
		
		
		
		System.out.println(Arrays.binarySearch(arr, &quot;champion&quot;));
		System.out.print(Arrays.binarySearch(arr, &quot;You&quot;));

	}

}

Saída:

[0] = You
[1] = acx
[2] = champ
[3] = champion
[4] = java
3
0

Ou seja -1 é igual a posicão --> (-(-1)+1)
Se "You" não estiver no vetor, o metodo retorna que ele deveria ser inserido na posição "o"!

Agora porque you vem em primeiro lugar ae ja não sei...

ribclauport

Aff… a palavra “You”, está com letra maiúscula!, sendo assim é considerada a primera palavra do vetor quando for ordeando!, palavras com letra maiuscula vão vir antes!
Exemplo: “Java”, vem antes de “java”. No vetor como “You” é a única com letra maiúscula, vai ser a primeira palavra na ora da ordenação.
mude de “You” para “you” e veja o que acontece!

qualquer dúvida poste novamente!

B

Valew galera muito obrigado a todos !!!

Criado 10 de janeiro de 2008
Ultima resposta 18 de mar. de 2012
Respostas 24
Participantes 4