Vetores ordenados

14 respostas
rijava
Bom dia galera, beleza?

estou com um exercício simples para ordernar meu vetor em order crescente.

eu recebo uma string com o valor.

dou um split no 'hifen para descobrir as posiçoes.

faço um laço para a comparação;

aqio esta dando um erro na linha

[i] if( (tamanho[i])<(tamanho))

esta dizendo.

operator < cannot be applied to java.lang.String.
desculpa a ignorancia, sou novo nessa área e estou tentando.
minha logica está errada?

String x = "12-3-9-1";
String y;
        String[] tamanho = x.split("-");
        int i;

        for(i=0; i<tamanho.length; i++)
            {
                if( (tamanho[i])<(tamanho[i+1]))

               y = tamanho[i];
               tamanho[i] = tamanho[i+1];
               tamanho[i+1] = y;
            }

14 Respostas

E

Para comparar 2 strings, você não pode usar “<” e sim “compareTo”. Exemplo para “a < b”:

String a = "feijão";
String b = "macarrão"; 
if (a.compareTo (b) < 0) { // equivale a "a < b"
...
}

Para “a > b” use “a.compareTo(b) > 0” e para “a == b” use “a.equals (b)”. OK?

WendersonLP

Bem, o problema é que você está fazendo comparação de maior(>) ou menor(<) com Strings, você
terá que conterver esse valores para números inteiros, ou outro tipo de for o caso, e ai sim poderá
fazer essas comparações.

rijava

entanglement

Entao cara, mas o meu codigo teria que ficar

if( tamanho[i].compareTo(tamanho[i+1]) < tamanho[i+1] )

teoricamente teria que ficar assim, pois eu pretendo comparar a string 'a, com a ‘b’
mas nao ta dando certo :frowning:

E

Cadê o “zero”? Eu pus um zero no meu exemplo, você não pôs o zero.

if( tamanho[i].compareTo(tamanho[i+1]) < 0)
B

Dê uma olhada no JavaDoc do Comparable.compareTo() para ter uma idéia de como usá-lo.

pvrsouza

:lol: Mastigado:

Esta forma que eu fiz é bem tosca(pelo fato de estar cheia de conversões). Mas a idéia é passar a só a lógica para vc.

public static void main(String[] args) {
        String string = "12-3-9-1";
        String[] numeros = string.split("-");
        int auxiliar;


        for (int y = 0; y < numeros.length; y++) {
            for (int x = 0; x < numeros.length - 1; x++) {
                if (Integer.parseInt(numeros[x + 1]) < Integer.parseInt(numeros[x])) {
                    auxiliar = Integer.parseInt(numeros[x + 1]);
                    numeros[x + 1] = String.valueOf(numeros[x]);
                    numeros[x] = String.valueOf(auxiliar);
                }
            }
        }

        for(int x = 0; x < numeros.length; x++){
            System.out.println(numeros[x]);
        }
    }
rijava

entanglement vou olhar o artigo que o bruno postou para entender esse ‘0’.

pvrsouza
legal seu codigo deu pra entender legal.
soh no final que nao consegui mto bem…

numeros[x] = String.valueOf(auxiliar);

o que isso quer dizer?
porque nao simplesmente

numeros[x] = auxiliar

acredito que seja por causa da conversao de tipo …
poderia me ajudar?
vlw

pvrsouza

rijava,

auxiliar = Integer.parseInt(numeros[x + 1]);

auxiliar recebe um valor int. Por isso a conversão de String para Inteiro (Integer.parseInt(numeros[x + 1])).

numeros[x] = String.valueOf(auxiliar);

numeros é um vetor de String. Portanto não dá para colocar um Inteiro dentro de uma variavel do tipo String. POr isto usa-se o String.valueOf().

Sacou? Ou confundi mais? SE não endeter me avisa que eu falo com mais explicadinho.

Abraços.

rijava

pvrsouza

mas tipo, auxiliar eh uma variavel do tipo inteiro.
dai ela tem que receber algo do tipo inteiro … no caso voce convertou o ‘numeros[x+1]’ para int.
dps, numeros[x+1] é um inteiro ou seja, ele soh pode receber inteiros … porque voce nao converteu o numeros[x] para inteiros tb?
ao inves de usar o String.valueOf…

nao sei se vc entendeu minha duvida…
a funcao do String.valueOf é exatamente o que ?
vlw ae cara.
desculpa a amolaçao… to começando agora com java ;

E

Olhe sempre a documentação - String.valueOf:

http://java.sun.com/javase/6/docs/api/java/lang/String.html#valueOf(int)

Esse fulano pega um int e transforma para uma String.

De qualquer maneira, seu problema não precisa ser muito complicado - basta usar o tal do compareTo, que mostrei acima. Não precisa ficar convertendo/desconvertendo a menos que, para você, “001” e “1” sejam a mesma coisa; nesse caso, é realmente necessário converter para inteiros.

pvrsouza

Veja se dá para entender assim:

for (int y = 0; y < numeros.length; y++) {
            for (int x = 0; x < numeros.length - 1; x++) {

                /*
                 * numeros[x + 1] e numeros[x] retornam um String
                 * Esta comparação "<" ou ">" com Strings não é possível pos isto a conversão:
                 * Integer.parseInt(numeros[x + 1]) e Integer.parseInt(numeros[x])
                 */
                if (Integer.parseInt(numeros[x + 1]) < Integer.parseInt(numeros[x])) {

                    /*
                     *auxiliar recebe um int
                     *Aqui ele já esta recebendo um String convertido em Int.
                     */
                    auxiliar = Integer.parseInt(numeros[x + 1]);
                    /*
                     * numeros recebe um String pois foi inicializado como um vetor de String.
                     * Neste caso realmente a conversão não é necessária porque eles são de tipos identicos.
                     */
                    numeros[x + 1] = numeros[x];
                    /*
                     *Numero recebe um String por isto a conversao de auxiliar, que é um int para String.
                     */
                    numeros[x] = String.valueOf(auxiliar);
                }
            }
        }
pvrsouza

entanglement:
Olhe sempre a documentação - String.valueOf:

http://java.sun.com/javase/6/docs/api/java/lang/String.html#valueOf(int)

Esse fulano pega um int e transforma para uma String.

De qualquer maneira, seu problema não precisa ser muito complicado - basta usar o tal do compareTo, que mostrei acima. Não precisa ficar convertendo/desconvertendo a menos que, para você, “001” e “1” sejam a mesma coisa; nesse caso, é realmente necessário converter para inteiros.

Certíssimo!! Tb recomendo olha esta documentação e usar o compareTo().

Só postei o código “tosko” para tentar desenvolver o raciocínio inicial dele. Eu acho o Booble Sort bem didático para quem está comecando.

rijava

EU FIZ UM EXEMPLO AQUI PRA SIMPLIFICAR O USO DO String.valueOf()

int numero = 54; String convertido; convertido = String.valueOf(numero); System.out.println(convertido); //vai mostrar 54.

entendi.
porém, no codigo do souza
tem assim:

auxiliar = Integer.parseInt(numeros[x + 1]); numeros[x + 1] = String.valueOf(numeros[x]); numeros[x] = String.valueOf(auxiliar);

numeros[x+1] = inteiro.
dai dps : numeros[x+1] = uma string…

nao entendi isso…

pvrsouza

rijava:

entendi.
porém, no codigo do souza
tem assim:

auxiliar = Integer.parseInt(numeros[x + 1]); numeros[x + 1] = String.valueOf(numeros[x]); numeros[x] = String.valueOf(auxiliar);

numeros[x+1] = inteiro.
dai dps : numeros[x+1] = uma string…

nao entendi isso…

Veja o que eu coloquei no segundo código que eu mandei:

/* * numeros recebe um String pois foi inicializado como um vetor de String. * Neste caso realmente a conversão não é necessária porque eles são de tipos identicos. */ numeros[x + 1] = numeros[x];

Ou seja, não precisava da conversão.

Criado 10 de março de 2010
Ultima resposta 10 de mar. de 2010
Respostas 14
Participantes 5