• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

bigboy123

Como ordenar um array (strings) através de Ciclos? [Outros metodos explicados]

22 mensagens neste tópico

Boas a todos.

Preciso de saber como faço para ordenar 21 textboxs onde em cada uma está um nome completo de uma pessoa e ao clicar num botão as ordene por ordem crescente, por exemplo (A, B, C, etc..).

Se parecer confusa a minha dúvida apresento aqui como fiz para ordenar 21 texboxs onde continham numeros em cada uma de maneira a que ficasse por ordem crescente(usei o método, selection sort):

        Dim nome(20) As Integer
        Dim i, max, t, max_pos As Integer

        nome(0) = txtprocesso1.Text
        nome(1) = txtprocesso2.Text
        nome(2) = txtprocesso3.Text
        nome(3) = txtprocesso4.Text
        nome(4) = txtprocesso5.Text
        nome(5) = txtprocesso6.Text
        nome(6) = txtprocesso7.Text
        nome(7) = txtprocesso8.Text
        nome(8) = txtprocesso9.Text
        nome(9) = txtprocesso10.Text
        nome(10) = txtprocesso11.Text
        nome(11) = txtprocesso12.Text
        nome(12) = txtprocesso13.Text
        nome(13) = txtprocesso14.Text
        nome(14) = txtprocesso15.Text
        nome(15) = txtprocesso16.Text
        nome(16) = txtprocesso17.Text
        nome(17) = txtprocesso18.Text
        nome(18) = txtprocesso19.Text
        nome(19) = txtprocesso20.Text
        nome(20) = txtprocesso21.Text

        For j As Integer = 0 To 19
            max = nome(0)
            max_pos = 0
            For i = 0 To 20 - j
                If max < nome(i) Then
                    max = nome(i)
                    max_pos = i

                End If

            Next

            t = nome(max_pos)
            nome(max_pos) = nome(i - 1)
            nome(i - 1) = t

        Next

        txtprocesso1.Text = nome(0)
        txtprocesso2.Text = nome(1)
        txtprocesso3.Text = nome(2)
        txtprocesso4.Text = nome(3)
        txtprocesso5.Text = nome(4)
        txtprocesso6.Text = nome(5)
        txtprocesso7.Text = nome(6)
        txtprocesso8.Text = nome(7)
        txtprocesso9.Text = nome(8)
        txtprocesso10.Text = nome(9)
        txtprocesso11.Text = nome(10)
        txtprocesso12.Text = nome(11)
        txtprocesso13.Text = nome(12)
        txtprocesso14.Text = nome(13)
        txtprocesso15.Text = nome(14)
        txtprocesso16.Text = nome(15)
        txtprocesso17.Text = nome(16)
        txtprocesso18.Text = nome(17)
        txtprocesso19.Text = nome(18)
        txtprocesso20.Text = nome(19)
        txtprocesso21.Text = nome(20)

EDIT: Retirada tag do titulo e pedido de ajuda urgente no texto

Edit2: Alterado titulo para se enquadrar melhor com a questão. - Weasel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em primeiro lugar deixa que te diga que as tags [urgente] e frisares que "esperas respostas rápidas" são imediatamente ignoradas por o meu parser biológico. Não acrescentam absolutamente nada à tua dúvida.

Depois, em vez de usares uma array, porque não usas uma, sei lá, List(Of String) por exemplo.

Colecções como List(Of String) já têm built-in o método "Sort" que faz exactamente o que pretendes.

Depois basta consumir item a item, com a índice, semelhante ao que fazes com a array.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para arrays tb existe o método estático Array.Sort que aceita qq tipo de array, tem o mm comportamento q o sort q o ribeiro referiu.

Espero respostas rápidas visto que amanhã tenho de ter isto pronto. :x

Isto não faz sentido. A ideia do fórum é ajudar quem quer aprender, e a aprendizagem não tem prazo.

Se queres entregar uma coisa só por entregrar, é problema teu, e bem pode ir sem funcionar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em relação ao "urgente" e "resposta rápidas" é devido a eu tar a fazer um mini projecto que tem de estar pronto para amanhã.. entendam como quiserem.

Agradeço a ajuda do ribeiro e bruno, mas eu preciso de fazer o código apenas através de arrays não posso "fugir" para outro método.

No que toca a ordenar texto através de arrays tou a 0 !

Podiam dar-me algumas luzes com um código exemplificado para que eu possa resolver a minha dúvida ? =P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O Array.Sort é apenas através de arrays, n utilizas mais nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deste-te ao trabalho de experimentar no mínimo o .Sort em cima da array antes de vires dizer que estás a zeros? :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O Array.Sort é apenas através de arrays, n utilizas mais nada.

Ok... Podes darme umas luzes de como aplicar o Array.Sort ao código apresentado no 1º Post ?  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

OMG  :wallbash:

De certeza que não é esse o método usado para ordenar 21 textboxs, ou então eu é que não estou a perceber nada.

Nem um cículo vou precisar de realizar para que sejam ordenadas as textboxs de A a Z (ascendentemente) ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Até 10000 textboxes se fosse necessário.

O que é ordenada é a array e como estás a alimentar as textbox de uma maneira sequencial, bate certo.

Os ciclos devem existir por trás do método Sort, mas isso não nos toca :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Entao como faço para as 21 textboxs ?

Eu não tou mesmo a perceber como implemento as textboxs nesse método  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bolas, fazes algo tão simples como isto:

        Dim nome(20) As Integer
        Dim i, max, t, max_pos As Integer

        nome(0) = txtprocesso1.Text
        nome(1) = txtprocesso2.Text
        nome(2) = txtprocesso3.Text
        nome(3) = txtprocesso4.Text
        nome(4) = txtprocesso5.Text
        nome(5) = txtprocesso6.Text
        nome(6) = txtprocesso7.Text
        nome(7) = txtprocesso8.Text
        nome(8) = txtprocesso9.Text
        nome(9) = txtprocesso10.Text
        nome(10) = txtprocesso11.Text
        nome(11) = txtprocesso12.Text
        nome(12) = txtprocesso13.Text
        nome(13) = txtprocesso14.Text
        nome(14) = txtprocesso15.Text
        nome(15) = txtprocesso16.Text
        nome(16) = txtprocesso17.Text
        nome(17) = txtprocesso18.Text
        nome(18) = txtprocesso19.Text
        nome(19) = txtprocesso20.Text
        nome(20) = txtprocesso21.Text

        For j As Integer = 0 To 19
            max = nome(0)
            max_pos = 0
            For i = 0 To 20 - j
                If max < nome(i) Then
                    max = nome(i)
                    max_pos = i

                End If

            Next

            t = nome(max_pos)
            nome(max_pos) = nome(i - 1)
            nome(i - 1) = t

        Next

        Array.Sort(nome)

        txtprocesso1.Text = nome(0)
        txtprocesso2.Text = nome(1)
        txtprocesso3.Text = nome(2)
        txtprocesso4.Text = nome(3)
        txtprocesso5.Text = nome(4)
        txtprocesso6.Text = nome(5)
        txtprocesso7.Text = nome(6)
        txtprocesso8.Text = nome(7)
        txtprocesso9.Text = nome(8)
        txtprocesso10.Text = nome(9)
        txtprocesso11.Text = nome(10)
        txtprocesso12.Text = nome(11)
        txtprocesso13.Text = nome(12)
        txtprocesso14.Text = nome(13)
        txtprocesso15.Text = nome(14)
        txtprocesso16.Text = nome(15)
        txtprocesso17.Text = nome(16)
        txtprocesso18.Text = nome(17)
        txtprocesso19.Text = nome(18)
        txtprocesso20.Text = nome(19)
        txtprocesso21.Text = nome(20)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ALELUIA  :)

Assim ja percebi o lugar onde tem que ficar o array.sort ! xD

Obrigado  :P:D:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou algo com menos código:

        Dim nome(20) As Integer
        Dim i, max, t, max_pos As Integer

        For I = 0 to 20
             nome(I) = Me.Controls("txtprocesso" & (I + 1)).Text
        Next

        For j As Integer = 0 To 19
            max = nome(0)
            max_pos = 0
            For i = 0 To 20 - j
                If max < nome(i) Then
                    max = nome(i)
                    max_pos = i

                End If

            Next

            t = nome(max_pos)
            nome(max_pos) = nome(i - 1)
            nome(i - 1) = t

        Next

        Array.Sort(nome)

        For I = 0 to 20
             Me.Controls("txtprocesso" & (I + 1)).Text = nome(I)
        Next

Estive agora a olhar com atenção para o teu código, e para que servem as linhas que eu seleccionei? Era onde estavas a tentar ordenar? Se sim isso tudo pode ser apagado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Calma...

Dessa maneira só é válido para números !

Eu quero ordenar NOMES ! (letras) e náo números...

Dessa meneira ele apresenta obviamente o erro na linha:

nome(I) = Me.Controls("txtprocesso" & (I + 1)).Text

(Conversion from string "" to type 'Integer' is not valid.)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também me parece que estão a "ordenar" duas vezes, apaga o código que o anolsi colocou em destaque e vê se não ordena na mesma...

E volto a frisar, estar a pedir "Preciso disto e é para já" não é de bom tom, humildade acima de tudo!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já consegui ordenar os nomes e com tanta complicação apenas duas declarações é que tinham de ser mudadas...

Dim nome(20) As string

Dim max, t, max_pos As string

Dim i as integer

Solved  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Creio que está a fazer confusão com algo que podes simplificar..

Utiliza uma ArrayList, adicionas os valores, ordenas, e voltas colocar os valores ordenados..

Ve se percebes:

        Dim arrText As New ArrayList

        arrText.Add(txtprocesso1.Text)
        arrText.Add(txtprocesso2.Text)
        'o resto....

        arrText.Sort()

        txtprocesso1.Text = arrText.Item(0)
        txtprocesso2.Text = arrText.Item(1)
        'o resto....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sugeri-lhe uma solução semelhante mas recusou.

Parece que tem de ser uma array. Talvez porque seja um exercício e como tal tem de seguir certas linhas.

A meu ver só precisava disto:

'Metes os valores das textboxes para array, uma ordem qualquer
        nome(0) = txtprocesso1.Text
        nome(1) = txtprocesso2.Text
        nome(2) = txtprocesso3.Text
        '(...)

'Ordenas a array e tens desta forma o sorteio ordenado do indice 0 ao maximo
        Array.Sort(nome)

'como a array está ordenada, basta atribuír o indice 0 à textbox1, 1 à textbox2, e por aí fora.
'ficas com as tuas textboxes com as strings previamente ordenadas na array
        txtprocesso1.Text = nome(0)
        txtprocesso2.Text = nome(1)
        txtprocesso2.Text = nome(2)
        '(...)

Mas parece que já está resolvido, e ainda bem :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas era a declaração que tava mal !

Em vez de Integer tive de colocar String (devido a eu usar um ciclo for.. next..) e não precisar do Array.Sort apesar de ser mais simples.

Eu tinha obrigatóriamente de usar Arrays e Ciclos  :mad:

Mas enfim.. Assim ainda aprendi a organizar as text sem usar ciclos  :D

Obrigado pelas ajudas  :thumbsup::P:thumbsup: :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sendo assim o titulo do tópico deveria ser "Como ordenar um array (de strings) através de Ciclos?"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sendo assim o titulo do tópico deveria ser "Como ordenar um array (de strings) através de Ciclos?"

Claro o erro foi meu  :thumbsup:

Obrigado por tudo mais uma vez :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora