Capítulo 11 Ordenação e pesquisa com java.Arrays Métodos sort e binarySearch da classe utilitária java.Arrays Ordenação de objectos baseada no método Comparable Ordenação • A classe utilitária Arrays do Java disponibiliza o método estático de ordenação sort, com implementação baseada no algoritmo de ordenação Quicksort import java.util.Arrays; • A ordenação é feita de acordo com a ordem natural ascendente dos seus elementos. Por exemplo: int[] va = {9, 12, 3, 5, 1, 16} ; Arrays.sort(va); { 1, 3, 5, 9, 12, 16 } int[] vb = {19, 2, 3, 25, 1, 16, 43, 23} ; // ordenação do índice 2 ao índice 6 Arrays.sort(vb, 2, 6); { 19, 2, 1, 3, 16, 25, 43, 23 } Introdução à Programação 2007/08 A. Lopes Pesquisa num vector ordenado • A classe utilitária Arrays do Java disponibiliza o método estático binarySearch para pesquisa de elementos. A sua utilização pressupõe que o vector esteja ordenado. O método devolve: • o índice do elemento, se foi encontrado • ou -k-1, em que k é a posição onde deveria estar o elemento. Assim sendo, obtém-se sempre um resultado negativo neste caso int[] va = { 1, 4, 9 }; int value = 7; int pos = Arrays.binarySearch(va, value); // devolve -3; value deveria estar antes da posição 2 • No caso de repetição no vector do elemento a pesquisar, o valor a devolver pode ser qualquer um dos índices válidos Introdução à Programação 2007/08 A. Lopes Ordenação de objectos • O método Arrays.sort também permite a ordenação de objectos de classes com um método compareTo, i.e. que implementam a interface Comparable public interface Comparable { int compareTo( Object otherObject ); } • Uma chamada do tipo a.compareTo(b) devolve (relembrar o caso de strings) • um número negativo se a deve ser apresentado antes de b • 0 se a e b são iguais • um número positivo caso contrário Introdução à Programação 2007/08 A. Lopes Ordenação de objectos • Existem várias classes Java que implementam Comparable. Por exemplo, as classes String e Date. O programador pode também implementar a interface Comparable para as suas próprias classes, de modo a possibilitar a utilização posterior do método Arrays.sort public class Coin implements Comparable { ... public int compareTo(Object otherObject) { Coin other = (Coin) otherObject; if (value < other.value) return -1; if (value == other.value) return 0; return 1; } ... Coin[] coins = new Coin[n]; } // adiciona moedas ... Arrays.sort(coins); Introdução à Programação 2007/08 Coin compareTo() <<interface>> Comparable A. Lopes