Pessoa tenho o seguinte problema, preciso ordenar um tabela pela coluna, por exemplo quando o usuário clicar em uma determinada coluna ele vai ordenar toda tabela pela aquela linha, certo meu problema está no seguinte ponto, tipo eu nunca vou saber qual o tipo de valor que contém aquela coluna, tipo se é string, int, boolean e tudo mais…então daí eu tenho que fazer um métod genérico que interprete esse tipo tá até aí beleza também, meu problema esta aqui nesse método.
publicintcompare(Objecta,Objectb){// Treat empty strains like nullsif(ainstanceofString&&((String)a).length()==0){a=null;}if(binstanceofString&&((String)b).length()==0){b=null;}// Sort nulls so they appear last, regardless// of sort orderif(a==null&&b==null){return0;}elseif(a==null){return1;}elseif(b==null){return-1;}elseif(ainstanceofComparable){if(ascending){return((Comparable)a).compareTo(b);}else{return((Comparable)b).compareTo(a);}}else{if(ascending){returna.toString().compareToIgnoreCase(b.toString());}else{returnb.toString().compareToIgnoreCase(a.toString());}}}
Quando eu passo o objeto A com valor 6 e o objeto b com valor 15 e ascending igual a true ele me retorna que 5, tipo ele fala que 6 é maior que 15. Alguém poderia me ajudar nisso.
Se você passou "6" e "15" é claro que "6" > "15" . (O dígito 6 vem depois do dígito 1 na tabela ASCII )
Foi uma String ou um java.lang.Integer que você passou?
P
phillip666
Cara se você não viu meu parâmetro é do tipo Object.
T
thingol
É claro que seu parâmetro é do tipo Object.
Mas o que você passou lá? é “6” ou Integer.valueOf(6)?
P
phillip666
Então véio acho que você não entendeu meu problema é esse independendo se é string int char double … ele tem que comparar a com b. então eu comparo dois object. Independente do valor que jogo pra object o que importa é que ele é um object.
getAndSet
ola amigo pelo o que eu entendi voce quer ordenar uma coluna da
JTable pelo conteudo das linhas
se vc usa a versão do java 6.0
tem uma propriedade que faz isso
JTable.setAutoCreateRowSorter(true);
esta propriedade faz com que quando você clica na coluna ela ordena
a coluna pelo conteudo das linhas do JTable
OBS: quando for fazer uma busca e colocar o conteudo de novo
JTable.setAutoCreateRowSorter(false);//busca//seta- se o modelJTable.setAutoCreateRowSorter(true);
porque se não fizer isso gera uma erro
até mais
P
phillip666
É realmente se eu comparar “6” com “15” ele vai falar que é maior porque ele vai comparar o 6 com o 1 mas não é isso que eu quero. O que eu quero é comparar o objeto inteiro. Pelo jeito a unica maneira de fazer isso é converter pra int quando o valor vier assim, mas eu não queria isso porque daí quando vier string eu vou ter que validar se é string para comparar com o compareTo(). Se algum entendeu meu problema me ajude. Ah devido a critério da firma eu só posso usar o java 1.4
T
thingol
Você precisa de um comparador de strings que leve em conta se ela começa por número. Basicamente ele seria algo assim:
Pegar a primeira string
Se ela começar por um número, converter o número
Pegar a segunda string
Se ela começar por um número, converter o número
Se ambas as strings começarem por números, então comparar os números primeiro, e depois comparar o resto das strings.
Ou seja: "12dias" < "6dias" , "12meses" < "6anos" e assim por diante.
Note que Integer.parseInt, DecimalFormat.format etc. requerem que a string inteira seja numérica. Portanto é necessário escrever uma rotina que pegue a string e veja até onde ela é numérica. Como você está usando o Java 1.4, pode usar uma expressão regular se quiser.
T
thingol
Tente o código abaixo. Ele é capaz de comparar duas strings, e se começarem por número (atenção - o número não pode ter pontos ou vírgulas), então ele faz as coisas do jeito que você quer.
Se o número tiver pontos ou vírgulas, o código abaixo não vai funcionar do jeito que você quer.
importjava.util.*;importjava.util.regex.*;classCompareStrings{privatestaticPatternpatStartsWithNumber=Pattern.compile("^\\s*([-+]?\\d+)\\s*");/** * Compara duas strings, de modo que leve em conta se elas * começam por um valor numérico, e ordene corretamente. * Por exemplo: "6dias" < "12meses". */publicstaticintnumericCompare(finalStrings1,finalStrings2){Matchermatch1=patStartsWithNumber.matcher(s1);Matchermatch2=patStartsWithNumber.matcher(s2);if(match1.find()&&match2.find()){// Aqui vamos comparar os valores numéricoslongn1=Long.parseLong(match1.group().trim());longn2=Long.parseLong(match2.group().trim());if(n1<n2)return-1;elseif(n1>n2)return+1;// Como as partes numéricas batem, devemos checar agora a parte stringStringresto1=s1.substring(match1.end());Stringresto2=s2.substring(match2.end());returnresto1.compareTo(resto2);}returns1.compareTo(s2);}publicstaticvoidmain(String[]args){String[]teste={"12meses","6dias","10horas","10anos","-10horas","20","Araraquara",// vem depois dos dígitos"#bleargh!",// vem antes dos dígitos};Arrays.sort(teste,newComparator(){publicintcompare(Objectobj1,Objectobj2){returnnumericCompare((String)obj1,(String)obj2);}});System.out.println(Arrays.asList(teste));}}