Comparando objetos

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.

Se você passou "6" e "15" é claro que "6" &gt "15" . (O dígito 6 vem depois do dígito 1 na tabela ASCII :stuck_out_tongue: )

Foi uma String ou um java.lang.Integer que você passou?

Cara se você não viu meu parâmetro é do tipo Object.

É claro que seu parâmetro é do tipo Object.
Mas o que você passou lá? é “6” ou Integer.valueOf(6)?

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);

porque se não fizer isso gera uma erro
até mais :smiley:

É 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" &lt "6dias" , "12meses" &lt "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.

[code]
import java.util.;
import java.util.regex.
;

class CompareStrings {

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" &lt "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 &lt n2) return -1; else if (n1 &gt 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));
}

}[/code]