Dúvidas binarySearch

4 respostas
w1l14n

Boa tarde pessoal!

Estou com um problema aki e peço a ajuda de vocês.

Estou tentando fazer uma busca passando um comparator e não está funcionando.

Qdo faço essa chamada:

int num = Arrays.binarySearch(arrayFruta,new Orange("Laranja1"),rsFruta);

Ele me da a seguinte mensagem de erro:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types
found   : java.util.Arrays.binarySearch
required: int

Só que qdo chamo o método binarySearch assim:

int num = Arrays.binarySearch(arrayFruta,new Orange("Laranja1"));

Funciona normalmente, inclusive qdo chamo:

Collections.sort(lstFruta,rsFruta);

Ordenando o ArrayList com o Comparator, que gerou o arrayFruta, funciona normalmente.

Abaixo a minha classe ReverseFruit

public class ReverseFruit implements Comparator<Fruit>{

    @Override
    public int compare(Fruit o1, Fruit o2)
    {
        return o2.getNomeFruta().compareTo(o1.getNomeFruta());
    }

}

Agradeço a ajuda.

4 Respostas

T

binarySearch recebe 3 parâmetros - o array, o objeto a ser encontrado, e o comparador. Entretanto, por algumas sutilezas na implementação de generics, é necessário que o 2o. parâmetro tenha exatamente o mesmo tipo que o array - nem mais, nem menos - e talvez você precise usar um cast explícito:

.... = Arrays.binarySearch (arrayFruta, (Fruit) new Orange ("Laranja1"), rsFruta);
w1l14n

Não funcionou.

Mesmo problema.

T

Sei lá o que pode estar dando errado no seu programa. Aqui vai um programa que usa Arrays.binarySearch com várias frutas.

import java.util.Arrays;
import java.util.Comparator;

abstract class Fruta  {
	private String nome;
	public String getNome() { return nome; }
	public abstract double getPreco();
	public Fruta (final String nome) { this.nome = nome; }
	public String toString() { return nome; }
}

class Laranja extends Fruta {
	private String variedade;
	private double preco;
	public Laranja (final String variedade, final double preco) {
		super ("Laranja");
		this.variedade = variedade; this.preco = preco;
	}
	public double getPreco() { return preco; } 
	public String toString() { return String.format ("%s,%s,%.2f", getNome(), variedade, preco); }
}

class Maca extends Fruta {
	private String variedade;
	private double preco;
	public Maca (final String variedade, final double preco) {
		super ("Maca");
		this.variedade = variedade; this.preco = preco;
	}
	public double getPreco() { return preco; } 
	public String toString() { return String.format ("%s,%s,%.2f", getNome(), variedade, preco); }
}

class OrdenadorFrutas implements Comparator&lt;Fruta&gt; {
	@Override
	public int compare(Fruta o1, Fruta o2) {
		int rc = o1.getNome().compareTo (o2.getNome());
		if (rc != 0) return rc;
		else return (int) Math.signum(o1.getPreco() - o2.getPreco());
	}
}

public class TesteBinarySearch {
	public static void main(String[] args) {
		Fruta[] frutas = { new Laranja ("baiana", 20.0), new Maca ("fuji", 20.0), new Laranja ("seleta", 10.0) };
		Arrays.sort (frutas, new OrdenadorFrutas());
		System.out.println (Arrays.asList (frutas));
		int rc = Arrays.binarySearch (frutas, new Laranja ("baiana", 20.0), new OrdenadorFrutas());
		System.out.println (rc);
	}
}
w1l14n

Vlw pela ajuda, consegui fazer funcionar qdo mantenho um conjunto e não converto para Array.

Collections.sort(lstFruta, new SortCodigoFruit());

Collections.binarySearch(lstFruta, new Apple(3, "maça"),new SortCodigoFruit());
Criado 22 de junho de 2009
Ultima resposta 25 de jun. de 2009
Respostas 4
Participantes 2