Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Ordinare Stringhe

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43

    Ordinare Stringhe

    Ciao a tutti, sto imparando a programmare in java e mi sono imbattuto in un esercizio abbastanza ostico. In pratica dopo aver acquisto delle stringhe, devo ordinarle o con il metodo 1 o con il metodo 2.

    Metodo 1:
    devo ordinare le stringhe a partire dal 3˚ carattere della stringa, es. mare, sale, cane diverrebbe sale, cane, mare.

    Metodo 2:
    devo ordinare le stringhe in bas e alla posizione della prima occorrenza della lettera "a" nella stringha, es mare, andare, svoltare diverrebbe andare, mare, svoltare.

    Ora, tralasciando i casi particolari (assenza della lettera "a' o stringa con lunghezza < 3, ecc...), non so come poter ordinare, ho guardato in rete ma trovo tutte soluzioni che mi ordinano le stringhe in ordine alfabetico, ma partendo dal primo carattere, e questo vale anche per le api di java che ho trovato.
    Potreste darmi una mano a risolvere questi problemi, magari un suggerimento o se c'e' qualche api che mi puo' venire incontro e che evidentemente io non ho visto.

    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Ordinare Stringhe

    Originariamente inviato da cryspolo
    Metodo 1:
    devo ordinare le stringhe a partire dal 3˚ carattere della stringa, es. mare, sale, cane diverrebbe sale, cane, mare.

    Metodo 2:
    devo ordinare le stringhe in bas e alla posizione della prima occorrenza della lettera "a" nella stringha, es mare, andare, svoltare diverrebbe andare, mare, svoltare.
    Dipende se l'algoritmo di ordinamento (es. bubble-sort, quick-sort, merge-sort o qualunque altro di quelli "noti") lo devi implementare tu da zero oppure se ti basta ad esempio affidarti ai metodi di ordinamento presenti nel framework.

    Se è quest'ultimo caso, ci sono i sort() in java.util.Arrays (per gli array e in particolare di oggetti) e i sort() in java.util.Collections (per i List). E in entrambi i casi puoi implementare un tuo Comparator per fornire un criterio "particolare" che vuoi tu.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Posso benissimo utilizzare i metodi che java mi mette a disposizione, il problema e' che non capisco come fare. Se ad esempio utilizzo il quicksort, come faccio a dirgli che deve confrontare la terza lettera di ogni parola, e non la prima ?

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da cryspolo
    Posso benissimo utilizzare i metodi che java mi mette a disposizione, il problema e' che non capisco come fare. Se ad esempio utilizzo il quicksort, come faccio a dirgli che deve confrontare la terza lettera di ogni parola, e non la prima ?
    Con un Comparator personalizzato.
    http://docs.oracle.com/javase/6/docs...omparator.html
    http://javarevisited.blogspot.com/20...e-in-java.html
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da cryspolo
    Posso benissimo utilizzare i metodi che java mi mette a disposizione, il problema e' che non capisco come fare. Se ad esempio utilizzo il quicksort, come faccio a dirgli che deve confrontare la terza lettera di ogni parola, e non la prima ?
    Se usi i sort() del framework non devi, necessariamente, sapere dei bubble-sort, quick-sort ecc...

    L'algoritmo di ordinamento è già implementato nei sort!! Tu devi solo implementare un Comparator che definisce il criterio di ordinamento. Dati 2 oggetti, devi solo dire, secondo il tuo criterio, se uno è minore/maggiore/uguale all'altro.

    codice:
    import java.util.*;
    
    public class Prova {
        public static void main(String[] args) {
            String[] animali = { "coccodrillo", "gatto", "topo", "cane", "giraffa" };
            System.out.println(Arrays.toString(animali));
            
            Arrays.sort(animali, new StringByLenComparator());
    
            System.out.println(Arrays.toString(animali));
            // stampa [cane, topo, gatto, giraffa, coccodrillo]
        }
    }
    
    class StringByLenComparator implements Comparator<String> {
        public int compare(String s1, String s2) {
            int len1 = s1.length();
            int len2 = s2.length();
            
            // compara per la lunghezza
            if (len1 < len2) {
                return -1;     // s1 minore di s2
            } else if (len1 > len2) {
                return +1;     // s1 maggiore di s2
            } else {
                // per lunghezza uguale, compara lessicograficamente (nel modo naturale)
                return s1.compareTo(s2);
            }
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Sto usando una linked list, il sort funziona uguale?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Sono riuscito ad implementare cosi' come mi avete suggerito, ora pero' sorge un problema, se le stringhe hanno lunghezza >= 3 allora tutto ok, ma se ci sono strighe con lunghezza < 3 allora mi viene tutto sballato, siccome le stringhe con lunghezza inferiore a 3 devo metterle infondo alla lista senza preoccuparmi dell'ordine, come posso dirgli di metterle infondo?

    Avevo pensato a fare un controllo sulla lista principale, che da ora in avanti chiamero' lista1, e ricopiare tutte le stringhe con lunghezza < 3 in un altra lista, che da ora in avanti chiamero' lista2 per non confondere e la lista1, rimuovendole dalla lista1, ordinare la lista1 e poi reinserire gli elementi della lista2 in coda alla lista1, pero' immagino che un algoritmo del genere mi sembra abbastanza costoso e poco furbo. Potreste suggerirmi qualche idea?

    Grazie

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da cryspolo
    Sto usando una linked list, il sort funziona uguale?
    Sì, funziona con qualunque List (parlo del sort() di Collections).

    Originariamente inviato da cryspolo
    se le stringhe hanno lunghezza >= 3 allora tutto ok, ma se ci sono strighe con lunghezza < 3 allora mi viene tutto sballato, siccome le stringhe con lunghezza inferiore a 3 devo metterle infondo alla lista senza preoccuparmi dell'ordine, come posso dirgli di metterle infondo?
    Il tuo compare sarà

    public int compare(String s1, String s2)

    codice:
    s1.length()  s2.length()   logica
    ----------------------------------------------------------------------
       >= 3         >= 3       Fai la tua logica di confronto specifica
                                  (che dovrà ritornare 0, <0, >0)
       >= 3          < 3       return -1   (s2 è maggiore e starà "dopo")
        < 3         >= 3       return +1   (s1 e maggiore e starà "dopo")
        < 3          < 3       puoi: o return 0 oppure un confronto
                                  differente per questo sotto-caso
                                  es. alfabetico
    Il concetto "metterle in fondo" è espresso da quei due return fissi -1/+1

    Originariamente inviato da cryspolo
    Avevo pensato a fare un controllo sulla lista principale, che da ora in avanti chiamero' lista1, e ricopiare tutte le stringhe con lunghezza < 3 in un altra lista, che da ora in avanti chiamero' lista2 per non confondere e la lista1, rimuovendole dalla lista1, ordinare la lista1 e poi reinserire gli elementi della lista2 in coda alla lista1, pero' immagino che un algoritmo del genere mi sembra abbastanza costoso e poco furbo.Grazie
    No, l'informatica è già abbastanza complessa così ... non complichiamoci la vita .....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Ho fatto come mi hai suggerito e funziona perfettamente, grazie mille !!!

    Ne approfitto per chiederti consiglio per il metodo2, pensavo di implementarlo cosi', passo al comparator sempre le mie due stringhe, e all'interno dello steso, cerco la prima occorrenza della "a" in entrambe le parole, ricavo gli indici e li confronto.
    Concettualmente dovrebbe funzionare, ma come al solito non sono sicuro che sia una cosa furba, hai qualche suggerimento?
    Grazie

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da cryspolo
    cerco la prima occorrenza della "a" in entrambe le parole, ricavo gli indici e li confronto.
    ma come al solito non sono sicuro che sia una cosa furba
    No no, concettualmente è assolutamente corretto!
    E String ha il metodo apposito .... indexOf. Occhio solo al fatto che può restituire -1 (=non trovato) ma qui devi sapere tu cosa fare di conseguenza cioè come considerarla.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.