Dúvida com pergunta do TestKiller [RESOLVIDO]

7 respostas
brunorota

Olá galera

Fiquei com uma dúvida aqui

public static void search(List<String> list) {
		 list.clear();
		 list.add("b");
		 list.add("a");
		 list.add("c");
		 System.out.println(Collections.binarySearch(list, "a"));
	}

Chamando esse método a saída pra mim é 1 porque ‘a’ está na posição 1 do List

Mais a resposta correta é o resultado não é previsível.

Porque o resultado não é previsível?

Att.

7 Respostas

renamed

Na verdade, a lista está desordenada, não necessariamente “a” está na primeira posicao da lista, você não especificou qual posição na lista “a” deveria ter sido inserido.
Vale lembrar que para usar a busca binária a lista tem que estar ordenada.

brunorota

Mais o ah está na segunda posição, a segunda posição não é 1?

E

A resposta é “não previsível” porque Collections.binarySearch e Arrays.binarySearch são métodos que funcionam corretamente apenas com coleções e arrays ordenados, respectivamente. Você está usando um ArrayList não ordenado (“b”, “a” e “c” está fora de ordem) então o método “binarySearch” não tem compromisso nenhum de funcionar corretamente.

brunorota

um arraylist eh ordenado ele não é classificado

A ordem dele é a ordem de inserção

T

list.clear(); list.add("b"); list.add("a"); list.add("c"); Collections.sort(list); System.out.println(Collections.binarySearch(list, "a"));

se você ordernar ele fica previsivel rsrsrs :wink:

renamed

Imagine que você crie uma classe que implementa a interface List e crie uma lista onde o elemento é sempre inserido no meio da lista.
Veja:

class GujList<E> implements List<E>{ private List<E> gujLista = new LinkedList<E>(); @Override public boolean add(E e) { int meio = gujLista.size() / 2; gujLista.add(meio, e); return true; } /*Restante dos métodos....*/ } // fim da classe

Agora, nossa busca binária não funciona:

public static void main(String[] args) {
		List<String> listaArrayList = new ArrayList<String>();
		List<String> listaLinkedList = new LinkedList<String>();
		List<String> listaCopyOnArrayList = new CopyOnWriteArrayList<String>();
		List<String> listaGujList = new GujList<String>(); 
		search(listaArrayList); // Retornou 1
		search(listaLinkedList); // Retornou 1
		search(listaCopyOnArrayList); // Retornou 1
		search(listaGujList); // Retornou -1
	}

Portanto, nossa busca binária é imprevisível, se a collection não for ordenada.

brunorota

HUmmm

Entendi

Muito obrigado a todos que ajudaram

VAleww

Criado 3 de julho de 2010
Ultima resposta 4 de jul. de 2010
Respostas 7
Participantes 4