Ordenação de palavras acentuadas

9 respostas
D

Pessoal,
eu pesquisei e nao encontrei nada que possa ta solucionando meu problema.

Eu tenho uma consulta, em que ordeno por ordem alfabetica, so que palavras acentuadas não ordena direito.
Exemplo:

  • Como posso ter adquirido o HIV, a Sífilis, Hepatite B ou C?
  • Como ter acesso à Farmácia Popular?
  • Há necessidade de colher segunda amostra?
  • Onde são localizadas as Farmácias Populares?
  • É possível pedir prazo para cumprimento da advertência?
  • Quais os animais estão disponíveis para adoção?
  • Quando realizar o teste após uma exposição de risco?

Eu utilizo o banco postgree junto com hibernate.

Vlw
Daidson

9 Respostas

robinsonbsilva

Jovem, se a ordenação é feita pelo banco de dados tenta ver o “COLLATE” do seu SGBD.

D

Colega eu não posso mexer no banco de dados, teria q ser uma solução através da aplicação.
Abaixo segue a consulta que fiz usando criteria:

DetachedCriteria crit = DetachedCriteria.forClass(this.getObjectClass()).createAlias(servico, s)

.setProjection(Projections.distinct(Projections.projectionList()

.add(Property.forName(this.pergunta))

.add(Property.forName(this.resposta))

.add(Property.forName(this.dataCriacao))

.add(Property.forName(s.id))
.add(Property.forName("s.nomePopular"))));
	crit.add(Restrictions.eq("s.versao", 0));

	crit.addOrder(Order.asc("this.pergunta"));
	
	return this.findDetachedCriteria(crit, null);
ViniGodoy

Experimente ordenar usando um Collator.

Por exemplo:
//Set com ordenação normal, como vc já faz
Set<String> set = new TreeSet<String>();
set.add("Ana");
set.add("Vinícius");
set.add("Óstia");
set.add("Ângstron");
set.add("Oswaldo");

//Imprime [Ana, Oswaldo, Vinícius, Ângstron, Óstia]
System.out.println(set);

//Set com ordenado com o Collator
Set<String> set2 = new TreeSet<String>(Collator.getInstance());

//Imprime Ana, Ângstron, Óstia, Oswaldo, Vinícius]
System.out.println(set2);
robinsonbsilva

Já que não é possível “alterar as configurações de BD e conexão”, use uma estrutura de dados que permita tal ordenação… como a citada acima!!

D

O meu find me retorna um List e eu nao entendi como irei usar esse collator, ja que no exemplo vc usa um set.

ViniGodoy

Como você faz a ordenação por ordem alfabética hoje?

E outra… no final das contas, vc não exibe uma string para o seu usuário, retirada de um dos atributos desse objeto (ou do toString)? Basta ordenar o que é exibido, não a list de objetos em si.

D

A ordenação é feita na busca.

Na hora de exibir eu nao simplesmente exibo o nome(string que quero ordenar), eu preciso do id e de outros campos, entao nao posso passar para um set de string.

ViniGodoy

Você tem que se decidir. Ou você ordena na busca, com as configurações do SGDB, ou ordena no braço.

Para ordenar no braço, vc terá que implementar um comparador, que usará o Collator na propriedade que quiser e ordenará a lista. Essa propriedade é a mesma string que vc exibe. Se fosse o toString, seria assim:

Collections.sort(resultados, new Comparator<Object>() { public void compare(Object o1, Object o2) { return Collector.compare(o1.toString(), o2.toString()); } }

O meu exemplo foi apenas demonstrativo. Obviamente você pode altera-lo para considerar a propriedade que quiser, ou mesmo usar uma subclasse mais conveniente no lugar de object. E claro, ordenar no braço exige que você entenda e saiba como funcionam as collections do Java. Se você ainda não sabe, leia material sobre o assunto: http://java.sun.com/docs/books/tutorial/collections/index.html

Agora, o fato é que no final você exibe uma String, então, é possível comparar usando Collator. Nem que, caso o List não possa ser modificado, você crie um TreeMap do texto ordenado com o índice do seu objeto no list, e então use esse treemap como índice na hora de exibir os dados. Ou que vc copie tudo para um novo list e então ordene.

Bem, soluções existem, o caminho já demos. Agora basta um pouco de boa vontade e raciocínio lógico.

D

Bom, consegui resolver via codigo…
Eu peguei a sua ideia e so fiz algumas alterações para object.

public List<Object> ordenaPalavrasAcentuadas(List lstObject,int posicao){
		
		final int pos = posicao;
		
		List<Object> lst = new ArrayList<Object>(lstObject);  
		final Collator ordenarIgnorandoAcentos = Collator.getInstance (new Locale ("pt", "BR"));  
		ordenarIgnorandoAcentos.setStrength (Collator.PRIMARY);  
		Collections.sort (lst, new Comparator<Object>() {  
		    public int compare (Object p1, Object p2) { 
		    	Object[] obj1 = (Object[])p1;
		    	Object[] obj2 = (Object[])p2;
		        return ordenarIgnorandoAcentos.compare (obj1[pos].toString(), obj2[pos].toString());  
		    }

			
		}); 
		
		
		return lst;
	}

valeu!!!

Criado 27 de abril de 2009
Ultima resposta 30 de abr. de 2009
Respostas 9
Participantes 3