Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [JAVA]Ordinare una Stringa

    Voglio ordinare mediante un doppio ciclo for una stringa confrontando di volta in volta i char che la costituiscono e nel frattempo ordinare un array di indici che esula dal resto;
    nel momento in cui ritorno un array di char contenente la Stringa che dovrebbe essere ordinata ottengo invece una stringa in cui i caratteri vengono si spostati ma non so secondo quale logica O.o

    codice:
    ordinato=k.toCharArray(); 
    for(int i=0;i<k.length()-1;i++){
     char box; int boxindice; 
         for(int j=1;j<k.length();j++){ 
              if(k.charAt(i)>k.charAt(j)){
                      box=ordinato[i]; 
                      boxindice=indici[i]; 
                      ordinato[i]=ordinato[j];
                      indici[i]=indici[j]; 
                      ordinato[j]=box; 
                      indici[j]=boxindice; 
              } 
           } 
    }
    es
    q9YU --> U9Yq
    xsGe --> eGxs

    Deve esserci qualche errore nel codice , magari una stupidata ... se qualcuno volesse illuminarmi ve ne sarei grato

    Grazie.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Stando all'algoritmo che intendi usare (un bubble-sort), l'indice del for più interno dovrebbe partire dall'attuale valore dell'indice del for più esterno. L'algoritmo, infatti, ad ogni iterazione del for più esterno, porta verso sinistra il valore "più piccolo"... non ha senso, quindi, confrontare gli elementi già ordinati.

    codice:
    for(int j=i;j<k.length();j++){
    Questo per quanto concerne la logica dell'algoritmo.

    E' chiaro che, per poter funzionare, è necessario che i confronti vengano fatti sull'array ordinato e non sulla stringa, che, essendo immutabile e non venendo mai toccata, non viene di certo ordinata. Quindi dovresti effettuare i confronti usando l'array "ordinato" e non i caratteri provenienti da "k.charAt(...)"... proprio perchè tu non modifichi la stringa "k".

    codice:
    if(ordinato[i]>ordinato[j]){
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Grazie ,hai perfettamente ragione XP

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Stai applicando in maniera sbagliata il bubblesort, non devi continuare a confrontare l' elemento di indice i con quello di indice j.Semmai l' elemento di indice i con l' elemento di indice i+1, altrimenti confronti sempre lo stesso elemento:

    codice:
            char[] ordinato=k.toCharArray();
        	for(int i=0;i<k.length()-1;i++)
        	{
        	    for(int j=0;j<k.length()-i-1;j++)
        	    { 
        	          if(ordinato[j] > ordinato[j+1])
        	          {
        	              char temp=ordinato[j];
        	              ordinato[j]=ordinato[j+1];
        	              ordinato[j+1]=temp;
        	          }
        	    } 
        	}
    Ti consiglio di prenderti l' algoritmo del bubblesort e di provare ad implementarlo per conto tuo.

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Originariamente inviato da LeleFT
    Lui però l' ha fatto al contrario.
    Quindi l' indice deve andare da 0 fino a length()-i-1 .
    Anche se è vero che l' algoritmo standard del bubblesort non è così.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Who am I
    Lui però l' ha fatto al contrario.
    Quindi l' indice deve andare da 0 fino a length()-i-1 .
    Anche se è vero che l' algoritmo standard del bubblesort non è così.
    Ehm... ho sbagliato io l'inizializzazione del secondo for... è sufficiente che j parta da i+1 fino a k.length(). Farlo in un senso o nell'altro non ha alcuna importanza: spostare in testa i valori più piccoli o portare alla fine quelli più alti non cambia molto... il senso dell'algoritmo è equivalente.
    Il problema era che i confronti li faceva sulla stringa originale e non sull'array che stava ordinando.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da LeleFT
    Farlo in un senso o nell'altro non ha alcuna importanza: spostare in testa i valori più piccoli o portare alla fine quelli più alti non cambia molto...
    Ciao.
    Cambierebbe su una lista. Comunque mi chiedevo con tutti gli algoritmi che ci sono perchè proprio un bubble sort? Ce ne sono di molto più performanti...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    E' il primo che mi è venuto in mente, se ne conosci di più performanti non ti impedisco di suggerirmene qualcuno . Grazie ancora

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Un quicksort (almeno che la stringa non sia già ordinata)?
    Oppure un merge sort...
    Oppure Wikipedia con la tavola delle comparazioni e gli esempi di codice ^^
    Comunque il quicksort è uno degli algoritmi più usati...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Originariamente inviato da LeleFT
    Il problema era che i confronti li faceva sulla stringa originale e non sull'array che stava ordinando.
    Non solo.Stava confrontando l' elemento i-esimo con l' elemento j-esimo.
    Pur facendo tale controllo sull' array di char l' algoritmo non sarebbe giusto.
    Bisogna confrontare l' elemento (j+1)-esimo con l' elemento j-esimo.

    A proposito dell' algoritmo, non è vero che il quicksort e il mergesort compiono sempre meno operazioni del bubblesort.Anche se hanno una complessità bassa le costanti moltiplicative sono alte, per cui il quicksort e il mergesort impiegano meno tempo solo per array molto numerosi.
    E suppongo che il suo array non sia molto grande, per cui il bubblesort va bene.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.