Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    10

    [java] Ordinamento di Testo

    Buongiorno a tutti,

    per il momento ho lasciato perdere i grafi dedicandomi ad altro. Ho Partorito questo e funziona.

    Non è altro che un analizzatore di testi che conta le occorrenze delle parole in un testo. Funziona correttamente:

    codice:
    import java.io.*;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.Scanner;
    
    
    public class TextAnalyzer {
    
    
        public static ArrayList<Entry> readWords (Scanner in){
            ArrayList<Entry> words = new ArrayList<Entry>();
            String w;
    intwIndex;
            while(in.hasNext()){
                w = in.next();
                Entry temp = new Entry(w,0);
                wIndex= words.indexOf(temp);
                if (wIndex==-1){
                    words.add(temp);
                }else{
    temp = words.get(wIndex);
                }
                temp.value +=1;
            }
    returnwords;
        }
    
    
    public static void main(String[] args){
        if (args.length <1){
            System.out.println("Devi specificare il nome del file da leggere");
            System.exit(0);
        }
        assert(args.length>=1);
        FileReader textReader = null;
    try{
            textReader = new FileReader(args[0]);
        }catch(Exception e){
            System.err.println("Non posso aprire il file "+args[0]);
            System.exit(0);
        }
    assert(textReader !=null);
        Scanner scanner = new Scanner(textReader);
        ArrayList<Entry> word = readWords (scanner);
        scanner.close();
    
    try{
            textReader.close();
        }catch(Exception e){
            System.err.println("Non posso chiudere il file "+args[0]);
            System.exit(0);;
        }
    
        Collections.sort(word);
        Iterator<Entry> ai = word.iterator();
    
        while(ai.hasNext()){
            Entry t =ai.next();
            System.out.println(t);
        }
    }
    
    
    }
    codice:
    public class Entry implements Comparable<Entry> {    
    public String key;
    publicintvalue;
    
    
        public Entry(String key, int value){
            this.key=key;
            this.value=value;
        }
    
        public int compareTo(Entry other){
            return key.compareTo(other.key);
        }
    
        public boolean equals(Object other){
    if(other==this) returntrue;
    if(!(otherinstanceof Entry)) returnfalse;
            Entry o = (Entry) other;
            return key.equals(o.key);
        }
    
        public String toString(){
            return (key+" "+value);
        }
    }

    Ho solo un dubbio sul funzionamento. Mi spiego meglio, la classe Entry implementa l'interfaccia Comparable, che effettua un ordinamento, ma in che modo? E poi, i metodi della classe Entry non vengono invocati nel main o in altri metodi della classe TextAnalyzer. Per cui mi viene da pensare che essi si invochino quando creo l'oggetto
    codice:
    Entry temp = new Entry(w,0)
    .

    E' corretto quello che dico?? Se no potreste spiegarmelo?

    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da sabbia89 Visualizza il messaggio
    la classe Entry implementa l'interfaccia Comparable, che effettua un ordinamento, ma in che modo?
    Collections.sort farà tante comparazioni tra coppie di oggetti Entry quante necessarie per la logica dell'algoritmo di ordinamento che è implementato nel sort (che per la cronaca è un "mergesort" ottimizzato).
    La logica di comparazione di due elementi però non è nel sort ma è delegata agli oggetti stessi che in questo caso devono implementare Comparable.

    Quote Originariamente inviata da sabbia89 Visualizza il messaggio
    Per cui mi viene da pensare che essi si invochino quando creo l'oggetto
    No.

    Il equals() viene usato dal indexOf() della lista.
    Il compareTo() viene usato dal sort.
    Il toString() viene usato quando fai System.out.println(t);


    P.S. tutto il codice si può ridurre/migliorare in più punti.
    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
    Dec 2015
    Messaggi
    10
    Ok sei stato molto chiaro. Però allora mi viene un dubbio, essendo indexOf un metodo di ArrayList, il sort importato con Collections e println un metodo di System, non avrei bisogno della classe Entry. Potrei fate tutto anche senza?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da sabbia89 Visualizza il messaggio
    essendo indexOf un metodo di ArrayList, il sort importato con Collections e println un metodo di System, non avrei bisogno della classe Entry. Potrei fate tutto anche senza?
    Tecnicamente il conteggio delle parole potresti anche farlo con una Map<String,Integer> (cioè parola --> contatore) senza per forza bisogno di una classe che modella l'insieme di parola e contatore.
    Ma se usi una classe come Entry, allora equals/compareTo/toString sono il minimo da implementare per l'uso che fai degli Entry.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    10
    Ok ti ringrazio sei stato chiarissimo , se hai voglia potresti darmi una mano per il problema che ho sui grafi, ho aperto un thread apposito.

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.