:?: Oi gente, tudo bem? Eu tô começando a entrar no mundo Java, e surgiu uma dúvida: existe alguma função, sem ser a Collections.sort (), que me permita ordenar dados armazenados em Java? Resumindo, como eu faço pra colocar um vetor em ordem alfabética, e consequentemente as outras informções?
Desde já agradeço pela ajuda. Valeu!
Arrays.sort();
vc passa por parametro um vetor de qualquer tipo, e ele ordena
há mais coisas a se considerar, mas básicamente é isso
Iniciante82, Seja bem vindo ao PJ!!!
Só algumas dicas:
se sua lista for de Strings, elas serão ordenadas em ordem lexicográfica…
se constituir de elementos do tipo Date, ele será ordenado em ordem cronológica…
O Java realiza essas ordenações através da:
:arrow: Interface Comparable
:arrow: Ordenação Natural
primeiramente, Bem Vindo ao Mundo Java e ao PJ!
Só para complementar:
Você pode implementar um algoritmo qualquer de ordenação, entre os muito conhecidos, e muitos deles você encontra pela net, tipo:
- BubbleSort (bom para listas pequenas)
- QuickSort e RandomQuickSort(O melhor e mais utilizado para listas grandes)
- SelectionSort (Muito Ruim)
- InsertionSort
Eu não sei se já existe estes métodos no JDK (eu acho que não 8O ) mas você pode fazer uma classe de ordenação, que utilize o compareTo dos elementos. O mais recomendado é você fazer tipo o seguinte:
[code]class Sort {
public static List sort(List lista) {
if(lista.size() > 2000) return quickSort(lista);
else return bubbleSort(lista);
}
public List bubleSort(List lista) {
//…
}
public List quickSort(List lista) {
//…
}
}[/code]
Eu mesmo acho que fica mais legal!
Espero ter ajudado
()'s
Primeiramente, gostaria de agradecer a todos vocês que estão me ajudando a conhecer um pouco mais sobre o Java, vou estar sempre por aqui pedindo ajuda, tá ? Mas tenho outra dúvida: e se eu quiser fazer um array de nomes e outro com as respectivas idades, por exemplo, como eu posso ordenar os nomes, e consequentemente as idades.
Ah! Se alguém souber me dizer onde eu posso encontrar estas funções do Java, agradeço!
Valeu!
O melhor a se fazer é criar uma classe (Pessoa, por exemplo) que implementa Comparable, que guarda os atributos nome e idade. Ai voce implementa um compareTo(Object o), fazendo a comparação pelo nome.
Voce armezena estes objetos em uma List (como o ArrayList), e quando for ordenar, o método utiliza o compareTo da sua classe. Então será ordenao os nomes seguidos da idade.
Espero ter ajudado!
()'s
Como assim? :?: Não entendi direito. Eu já tenho a classe com os atributos, o que eu não entendi, é como implementar um Comparable? Como posso fazer isso?
Obrigado.
vc pode simplesmente ordenar os dois juntos se vc tiver o seu proprimo algoritimo… basta qndo vc for trocar dois elementos de posicao, troque as posicoes do outro array tb… apesar que o mais aconcelhavel eh criar uma classe que tenha todos os atributos desejados, dai vc implementa Comparable e no metodo compareTo() faz a comparacao… dai vc pode ateh ter uma variavel estatica pra determinar o criteiro da ordenacao (seja por idade ou por nome)…
e qnto ao exemplo do PARQUE_MACABRO, n vale apena por um if pra decidir se vai ordenar com o bublesort ou com o quicksort, o bublesort tem a unica vantagem da facilidade, ou seja, ele eh simples e facil de aplicar, se vc jah ta escrevendo o quicksort, nao faz sentido usar o bublesort tb… mesmo com poucos elementos o quicksort eh mais rapido…
ta ai o algoritimo do quicksort:
public void quicksort(int p, int q, Comparable array[]){
if (p < q){
int x = particao(p, q, array);
quicksort(p, x - 1, array);
quicksort(x + 1, q, array);
}
}
public int particao(int p, int q,Comparable array[]){
int j = p - 1;
Comparable aux = array[q];
for (int i = p; i <= q; i++){
if (array[i].compareTo(aux) <= 0) troca(array, i, ++j);
}
return j;
}
public void troca(Comparable array[], int i, int j){
Comparable aux = array[i];
array[i] = array[j];
array[j] = aux;
}
lembre-se que arrays sao passados por referencia, portanto nao tem necessidade de ficar retornando o array pra atribuicao ou que o array seja uma variavel global…
É, acho que só o quickSort serve mesmo… andei estudando análise e eficiência de algoritmos demais… eheheh
Existe uma diferença sim, mas é de milisegundos (eheheh), acho que só é perceptível se o mesmo método seja chamada em várias Threads concorrentes, ou algo do tipo…
Mas o teu quickSort tá muito legal!
()'s
Deve-se levar em conta que o quicksort só é o melhor se os elementos estiverem completamente fora de ordem.
Quando vc não tem nossa da disposição dos elementos o melhor é o MergeSort que é o pau pra toda obra e roda sempre em n lg n.
Gente, valeu mesmo pela ajuda que vocês me deram. Vocês ajudaram a clarear a minha mente, por isso vou estar sempre por aqui tirando dúvidas com vocês.
Obrigado.