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.
public int compare( Object a , Object b ){
// Treat empty strains like nulls
if ( a instanceof String && ( (String) a ).length() == 0 ){
a = null;
}
if ( b instanceof String && ( (String) b ).length() == 0 ){
b = null;
}
// Sort nulls so they appear last, regardless
// of sort order
if ( a == null && b == null ){
return 0;
} else if ( a == null ){
return 1;
} else if ( b == null ){
return -1;
} else if ( a instanceof Comparable ){
if ( ascending ){
return ( (Comparable) a ).compareTo(b);
} else{
return ( (Comparable) b ).compareTo(a);
}
} else{
if ( ascending ){
return a.toString().compareToIgnoreCase(b.toString());
} else{
return b.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.
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.
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 model
JTable.setAutoCreateRowSorter( true);
É 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
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.
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.
private static Pattern patStartsWithNumber = 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".
*/
public static int numericCompare (final String s1, final String s2) {
Matcher match1 = patStartsWithNumber.matcher (s1);
Matcher match2 = patStartsWithNumber.matcher (s2);
if (match1.find() && match2.find()) {
// Aqui vamos comparar os valores numéricos
long n1 = Long.parseLong (match1.group().trim());
long n2 = Long.parseLong (match2.group().trim());
if (n1 < n2) return -1; else if (n1 > n2) return +1;
// Como as partes numéricas batem, devemos checar agora a parte string
String resto1 = s1.substring (match1.end());
String resto2 = s2.substring (match2.end());
return resto1.compareTo(resto2);
}
return s1.compareTo(s2);
}
public static void main(String[] args) {
String[] teste = {
"12 meses",
"6 dias",
"10horas",
"10anos",
"-10horas",
"20",
"Araraquara", // vem depois dos dígitos
"#bleargh!", // vem antes dos dígitos
};
Arrays.sort (teste, new Comparator() {
public int compare (Object obj1, Object obj2) {
return numericCompare ((String) obj1, (String) obj2);
}
});
System.out.println (Arrays.asList (teste));
}