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

    Problema con compareTo() riscritto

    Ciao a tutti ho un problema con l'overriding del etodo compareTo(): praticamente dovrei ordinare delle stringhe in un ArrayList ma in base all'ordine alfabetico di un loro carattere...ad esempio ho le stringhe:
    - ciao
    - abbastanza
    - scemo

    e le voglio ordinare in base al 2 carattere, dovrebbero comparirmi così:

    - abbastanza
    - scemo
    - ciao
    (b - c -i)

    Io ho scritto il seguente codice:

    public int compareTo(Object o) {

    int carat = Integer.valueOf(carattere.getText());
    String frase = String.valueOf((stringa.getText()).charAt(carat));
    String fraseO = String.valueOf(((String)(o)).charAt(carat));

    System.out.println(carat+" "+frase+" "+fraseO);

    if (frase.compareTo(fraseO) == 1) return 1;
    if (frase.compareTo(fraseO) == -1) return -1;
    if (frase.compareTo(fraseO) == 0) return 0;

    throw new UnsupportedOperationException("Not supported yet.");
    }

    dove carat è il numero del carattere in base al quale fare l'ordinamento, frase è la stringa che prende dalla JTextArea e fraseO è la stringa che confronta...al di là della correttezza dei confronti, quello che non capisco è come mai poprio non entra nel compare (infatti non stampa niente del system.out)..di seguito il contesto del codice:

    codice:
    public class Ordina extends JPanel implements Comparable,ActionListener {
    
        private JTextArea stringa,carattere;
        static int x=10, y=10;
        private ArrayList stringhe;
        
        public Ordina(JTextArea stringa, JTextArea carattere) {
            
            this.stringa = stringa;
            this.carattere = carattere;
            stringhe = new ArrayList();
            
        }
        
        
        public void paintComponent(Graphics g){
            
            super.paintComponent(g);
            
            y = 10;
            
            for (int i=0;i<stringhe.size();i++) {
               
            g.drawString((String)stringhe.get(i), x, y);
            
            y += 10;
            
            }
            
        }
    
        public void actionPerformed(ActionEvent e) {
            
            Graphics g = this.getGraphics();
            
            stringhe.add(stringa.getText());
            
            System.out.println("sono in sort");
            
            Collections.sort(stringhe);
            
            y = 10;
            
            for (int i=0;i<stringhe.size();i++) {
               
            this.repaint();
            
            }
            
            //throw new UnsupportedOperationException("Not supported yet.");
        }
    
        public int compareTo(Object o) {
            
            int carat = Integer.valueOf(carattere.getText());
            String frase = String.valueOf((stringa.getText()).charAt(carat));
            String fraseO = String.valueOf(((String)(o)).charAt(carat));
            
            System.out.println(carat+"  "+frase+"  "+fraseO);
            
            if (frase.compareTo(fraseO) == 1) return 1;
            if (frase.compareTo(fraseO) == -1) return -1;
            if (frase.compareTo(fraseO) == 0) return 0;
            
            throw new UnsupportedOperationException("Not supported yet.");
        }
    
    }
    Ciao ciao grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Comparable va implementato nella classe di cui sono gli oggetti da comparare. Ora ... tu non devi comparare oggetti di tipo Ordina. Tu devi comparare le stringhe presenti nell'ArrayList.

    Poi quando tu fai:
    Collections.sort(stringhe);

    il sort() si aspetta che gli oggetti implementino Comparable (vale appunto proprio per String che implementa Comparable).

    L'unica soluzione è creare una classe a parte che implementa Comparator e in cui definisci il metodo compare() (vedi documentazione).

    A quel punto devi invocare l'altro sort(), quello che prende un Comparator.

    Collections.sort(stringhe, new TuoComparatorParticolare());
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Allora, ho scritto queta:

    codice:
    public class Ordinamento implements Comparable<String> {
        
        private JTextArea stringa,carattere;
        
        public Ordinamento(JTextArea stringa, JTextArea carattere) {
            
            this.stringa = stringa;
            this.carattere = carattere;
            
        }
    
        public int compareTo(String o) {
            
            int carat = Integer.valueOf(carattere.getText());
            String frase = String.valueOf((stringa.getText()).charAt(carat));
            String fraseO = String.valueOf(((o)).charAt(carat));
            
            System.out.println(carat+"  "+frase+"  "+fraseO);
            
            if (frase.compareTo(fraseO) == 1) return 1;
            
            if (frase.compareTo(fraseO) == -1) return -1;
            
            if (frase.compareTo(fraseO) == 0) return 0;
            
            throw new UnsupportedOperationException("Not supported yet.");
        }
    
    }
    e in "Ordina":

    Collections.sort(stringhe,(Comparator) new Ordinamento(stringa,carattere));

    Però mi lancia delle eccezioni...

    Grazie mille intanto

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VforVENDETTA
    Allora, ho scritto queta:

    codice:
    public class Ordinamento implements Comparable<String> {
    Comparator, non Comparable.

    codice:
    public class Ordinamento implements Comparator<String>
    {
        public int compare (String s1, String s2)
        {
            // Qui compari le 2 stringhe s1 e s2 secondo il "tuo" criterio
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Perfetto, insistevo su omparable...adesso però non funziona l'ordinamento, cioè a volte va a volte no ma penso sia proprio sbagliato:

    codice:
    public int compare(String o1, String o2) {
            
            int carat = Integer.valueOf(carattere.getText());
            String frase = String.valueOf((o1).charAt(carat-1));
            String fraseO = String.valueOf((o2).charAt(carat-1));
            
            System.out.println(frase+"  "+fraseO);
            
           if (frase.compareTo(fraseO) == 1) return 1;
            
            if (frase.compareTo(fraseO) == -1) return -1;
            
            if (frase.compareTo(fraseO) == 0) return 0;
                    
            
            throw new UnsupportedOperationException("Not supported yet.");
        }
    
    Se inserisco le stringhe tenendo sempre lo stesso carattere (inteso come l' i-esimo) allora me lo ordina, ma se lo cambio mi lancia l'eccezione e si blocca...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VforVENDETTA
    Perfetto, insistevo su omparable...adesso però non funziona l'ordinamento, cioè a volte va a volte no ma penso sia proprio sbagliato:
    Innanzitutto 'carattere' è il componente in cui inserisci l'indice (1...N) da usare per fare la comparazione. Fin qui ok.

    Ma siamo sicuri che per tutte le stringhe nell'ArrayList l'indice non vada "fuori" dai limiti della stringa?? Es. chiedi l'indice 10 (offset 9 nella stringa), sei sicuro che tutte le stringhe abbiano almeno 10 caratteri???

    Questa è la prima questione. L'altra è che il tuo compare() potresti semplificarlo comparando direttamente i caratteri e non ottenendo delle stringhe.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Cavoli è vero il discorso del range..adesso provo..non ci ho fatto minimamente caso...

    Come non detto, non è quello il problema..ho provato mettendo stringhe abbastanza lunghe usando solo i il terzo carattere ma mi dà gia problemi all'inserimento della seconda stringa...

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VforVENDETTA
    Come non detto, non è quello il problema..ho provato mettendo stringhe abbastanza lunghe usando solo i il terzo carattere ma mi dà gia problemi all'inserimento della seconda stringa...
    Ti viene lanciata una eccezione a runtime??? Puoi riportare in modo esatto tale eccezione con lo stack trace??? Già con quello dovresti capire cosa è successo e dove.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    ecco tutte le eccezioni:

    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: Not supported yet.
            at provaesamefebbraio08.Ordinamento.compare(Ordinamento.java:44)
            at provaesamefebbraio08.Ordinamento.compare(Ordinamento.java:15)
            at java.util.Arrays.mergeSort(Arrays.java:1284)
            at java.util.Arrays.sort(Arrays.java:1223)
            at java.util.Collections.sort(Collections.java:159)
            at provaesamefebbraio08.Ordina.actionPerformed(Ordina.java:53)
            at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1882)
            at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2202)
            at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
            at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
            at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
            at java.awt.Component.processMouseEvent(Component.java:5602)
            at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
            at java.awt.Component.processEvent(Component.java:5367)
            at java.awt.Container.processEvent(Container.java:2010)
            at java.awt.Component.dispatchEventImpl(Component.java:4068)
            at java.awt.Container.dispatchEventImpl(Container.java:2068)
            at java.awt.Component.dispatchEvent(Component.java:3903)
            at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4256)
            at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3936)
            at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3866)
            at java.awt.Container.dispatchEventImpl(Container.java:2054)
            at java.awt.Window.dispatchEventImpl(Window.java:1791)
            at java.awt.Component.dispatchEvent(Component.java:3903)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
            at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
    BUILD SUCCESSFUL (total time: 35 seconds)
    Scusa ma cos'è lo stck trace?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VforVENDETTA
    [code]

    Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: Not supported yet.
    In effetti ho letto bene solo adesso il tuo codice di comparazione (prima non ci ho fatto nemmeno caso ):

    if (frase.compareTo(fraseO) == 1) return 1;
    if (frase.compareTo(fraseO) == -1) return -1;
    if (frase.compareTo(fraseO) == 0) return 0;

    Guarda che il compareTo() non è affatto obbligato a ritornare esattamente 1, -1 o 0. Può ritornare un qualunque valore negativo o positivo, a te interessa solo sapere che è >0, <0 o ==0.

    Quindi non solo il codice sopra è sbagliato, ma pure inutile. Perché puoi già ritornare direttamente il risultato di quel compareTo.

    return frase.compareTo(fraseO);

    E quel throw non serve (e non puoi più metterlo se fai questo return).

    Originariamente inviato da VforVENDETTA
    Scusa ma cos'è lo stck trace?
    È quello che hai postato, è la "storia" (per dirla in modo semplice) dei metodi invocati fino a quel punto.
    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.