Comparação de inteiros em String na Árvore Binária

Olá pessoal. Seguinte… estou com uma dúvida na implementaçao de meu programa da universidade. Preciso implementar uma Árvore Binária que guarda dados do tipo String… bem, trabalho feito. Seguindo pelo código abaixo, vcs podem ver que ao inserir ordenadamente na árvore, eu comparo o dado do pai com o dado do novo nó à ser inserido… eis a questão. E se eu digitar somente inteiros na String?

Por ex.:
:arrow: ao inserir [1, 2, 10] eu quero que ao listar crescentemente ele liste [1, 2, 10] e não [1, 10, 2].

Eu pesquisei aqui no fórum, li algo sobre as interfaces Comparator e Comparable, porém não consegui achar um jeito de implementar no meu problema.

Abaixo, meu código funcionando.

[code]import javax.swing.JOptionPane;

public class ArvoreBinaria {
private No raiz;

public ArvoreBinaria() {setRaiz(null);}

public No getRaiz() {return raiz;}
public void setRaiz(No raiz) {this.raiz = raiz;}

public boolean isEmpty() {return (getRaiz() == null);}

public void insereOrdenado(String dado) {
	No novo = new No();
	novo.setDado(dado);
	No r = insere(novo, getRaiz());
	setRaiz(r);
}

public No insere(No novo, No pai) {
	if (pai != null) {
		if (novo.getDado().compareTo(pai.getDado()) < 0) // Aqui eu faço a comparação entre as Strings
			pai.setEsquerda(insere(novo, pai.getEsquerda()));
		else
			pai.setDireita(insere(novo, pai.getDireita()));
		return pai;
	}
	return novo;
}

public String pesquisaBinaria(final String chave, No pai) {
	if (pai != null && pai.getDado().equals(chave)) {
		return "Valor: " + chave + "\nEncontrado: Sim";
	} else if (pai == null) {
		return "Valor: " + chave + "\nEncontrado: Não";
	} else if (chave.compareTo(pai.getDado()) < 0) { //Aqui também comparo as Strings
		pai = pai.getEsquerda();
		pesquisaBinaria(chave, pai);
	} else {
		pai = pai.getDireita();
		pesquisaBinaria(chave, pai);
	}
	return null;
}

public void listar() {
	if(isEmpty()) {
		JOptionPane.showMessageDialog(null, "Árvore Vazia! Impossível listá-la!", "Listar", JOptionPane.ERROR_MESSAGE);
		return;
	}
	String[] options = {"Crescente", "Decrescente", "Pré-Ordem", "Pós-Ordem"};
	int op = JOptionPane.showOptionDialog(null, "Selecione a forma de listagem:", "Listar",
			JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
	System.out.println();
	switch (op) {
	case 0: listarCrescente(getRaiz()); break;
	case 1: listarDecrescente(getRaiz()); break;
	case 2: preOrdem(getRaiz()); break;
	case 3: posOrdem(getRaiz()); break;
	default: JOptionPane.showMessageDialog(null, "Favor Selecionar uma das Opções", "Listar", JOptionPane.WARNING_MESSAGE); break;
	}
}

public void listarCrescente(No pai){
	if(pai != null){
		listarCrescente(pai.getEsquerda());
		System.out.print(pai.getDado() + " - ");
		listarCrescente(pai.getDireita());
	}
}

public void listarDecrescente(No pai) {
	if(pai != null){
		listarDecrescente(pai.getDireita());
		System.out.print(pai.getDado() + " - ");
		listarDecrescente(pai.getEsquerda());
	}
}

//abaixo métodos restantes[/code]

Obrigado desde já pessoal!

Use inteiros para montar a sua árvore, pois o método equals, se as duas string possuirem tamanhos diferentes, ela faz a comparação a partir do tamanho da string e não do seu valor semântico!

Pena que eu não posso fazer com inteiros, Thiago… tem que ser String mesmo.
Eu reescrevi o método compare da interface Comparator e até deu certo, com os nºs inteiros. Preciso testar agora com int e String juntos (ex.: 1a, 11A, 1b).

Obrigado pela atenção.

Este comparador compara duas strings, mas se elas começarem por um número, compara os números primeiro.

import java.util.regex.*;
...

    /**
     * Compara duas strings, mas se elas começarem por um número, compara os números primeiro.
     * Exemplo: "12lados" < "100lados".
     */
    public static class IdComparator implements Comparator<String> {

        static Pattern patStartsWithNumber = Pattern.compile("^([0-9]+)(.*)$");

        @Override
        public int compare(String o1, String o2) {
            Matcher m1 = patStartsWithNumber.matcher(o1);
            Matcher m2 = patStartsWithNumber.matcher(o2);
            if (m1.matches() && m2.matches()) {
                int rc = Integer.valueOf(m1.group(1)).compareTo(Integer.valueOf(m2.group(1)));
                if (rc == 0) {
                    return m1.group(2).compareTo(m2.group(2));
                } else {
                    return rc;
                }
            } else {
                return o1.compareTo(o2);
            }
        }
        private static IdComparator instance = new IdComparator();

        public static IdComparator getInstance() {
            return instance;
        }
    }

Vlw Thingol. Fiz como vc indicou ali…

Problema resolvido. :thumbup: