dae galera…estou com um problema!!
fiz um programa em uma lista duplamente encadeada que ordenava “String”…se digitar qualquer Nome(Rafael,Maria,Ana etc…)ele ordena sem nenhum problema…Mas caso eu coloque (1,10,2) era para ordenar como (1,2,10) mas nao é o que acontece…ele ordena (1,10,2) ele nao consegue comparar 10 é maior que 2, acho q ele ta pegando o “10” e comparando somente o número 1 ao invés de 10, como 1 é menor que 2 ele nao chega a pegar o proximo valor que seria o “0”…eu nao quero ter que converter para inteiro e fazer a comparaçao, eu quero comparar como um literal normal…Uma String!!
alguem pode me ajudar?
vlww
Como você está fazendo a comparação?! Se está usando o compareTo, tenha em mente o seguinte, se as duas strings não possuem o mesmo tamanho, então ele retorna a subratação dos tamanhos!
olha soh
você terá q ter uma classe Numero
e outra com um ArrayList desses numeros
e dentro desta array list tenta o seguinte metodo
public void ordenar()
{
boolean ordenado = false;
NomeDaClasse a = null, b =null;
while(ordenado = false)
{
for(int pos = 0; pos + 1< intanciaDaLista.size(); pos ++) // "pos" para navegar na lista
{
ordenado = true;
If(a.getNumero > b.getNumero)
{
instanciaDaLista.set(pos, b);
instanciaDaLista.set(pos+1, a);
ordenado = false;
}
}
}
onde esta o codigo juntamente com a duvida?
Ué, mas alfabeticamente, 10 vem antes de 2. Como você ordenaria alfabeticamente a seguinte lista (A, B, AB)?
Peguei esse exemplo aqui mesmo no guj a um tempo atraz, so estou com preguiça de procurar novamente para referencia.
[code]
/****
* Ordena uma lista de Strings onde o campo é numerico(String)
* sem a necessidade de converter para Integer
* ex. a lista 100,10,1,2,200,1023,120,112,101
* ordenada de forma natural ficaria 1,10,100,101,1023,112,120,2,200
* este metodo ordenara desta forma 1,2,10,100,101,112,120,200,1023
* @return
*/
public static Comparator getComparatorString() {
return new Comparator() {
public int compare(Object o1, Object o2) {
String arg0 = (String) o1;
String arg1 = (String) o2;
if(arg0.length() == arg1.length())
return arg0.compareTo(arg1);
else if(arg0.length() > arg1.length())
return 1;
else
return 0;
};
};
}
ex de uso
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("10");
list.add("22");
list.add("2");
list.add("15");
for (String string : list) {
System.out.println("Sem ordenação: "+string);
}
Collections.sort(list, getComparatorString());
for (String string : list) {
System.out.println("Com ordenação: "+string);
}
}[/code]
saida
Sem ordenação: 1
Sem ordenação: 10
Sem ordenação: 22
Sem ordenação: 2
Sem ordenação: 15
Com ordenação: 1
Com ordenação: 2
Com ordenação: 10
Com ordenação: 15
Com ordenação: 22
Opa amigo.
Cara você precisa que seja comparado um Texto e um Numerico com o mesmo comparador ?
Porque não criar um comparadorString e ComparadorNumerico ?
O compareTo da classe String faz a comparação de caracter por caracter, por isso que esta de dando esse retorno.
Acredito eu que fazer a ordenação com o compareTo sem fazer a converter para Integer não vai rolar.
/****
* Ordena uma lista de Strings onde o campo é numerico(String) sem a
* necessidade de converter para Integer ex. a lista
* 100,10,1,2,200,1023,120,112,101 ordenada de forma natural ficaria
* 1,10,100,101,1023,112,120,2,200 este metodo ordenara desta forma
* 1,2,10,100,101,112,120,200,1023
*
* @return
*/
public static Comparator getComparatorString() {
return new Comparator() {
public int compare(Object o1, Object o2) {
try {
Integer arg0 = Integer.valueOf((String) o1);
Integer arg1 = Integer.valueOf((String) o2);
return arg0.compareTo(arg1);
} catch (NumberFormatException e) {
String arg0 = (String) o1;
String arg1 = (String) o2;
return arg0.compareTo(arg1);
}
};
};
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("javacia");
list.add("1");
list.add("10");
list.add("10");
list.add("22");
list.add("2");
list.add("15");
list.add("javacia");
list.add("caio");
list.add("teste");
for (String string : list) {
System.out.println("Sem ordenação: " + string);
}
Collections.sort(list, getComparatorString());
for (String string : list) {
System.out.println("Com ordenação: " + string);
}
}
Nesse caso converti para Integer, e a saida ficou assim: