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

    [JAVA] hasmap e getBytes("US-ASCII")

    Devo indicizzare in maniera efficiente dati da file di testo e inserirli in una struttura dati che mi permetta di avere il mionor costo computazionale possibile per inserimento e ricerca. Il file di testo contiene una parola in ogni riga e possono esserci parole uguali nello stesso file; come risultato della ricerca finale devo restituire la somma del numero delle volte che le parole oggetto di ricerca sono presenti nel file.

    Leggendo la documentazione mi sembra di capire che una struttura che fa al caso mio è l'hashmap che mi permette di effettuare inserimento e ricerca in tempo costante (O(1) giusto? documentazione HashMap ). Fin qui tutto bene, credo.
    Devo, ora, trovare una funzione che mi permetta di riconoscere univocamente le stringhe che ho ottenuto dal file e che per stringhe uguali mi fornisca lo stesso riusltato; per questo pensavo di convertire la stringa nel suo codice ASCII. Qui sorge il problema: il metodo getBytes("US-ASCII") (getBytes).

    Se non ho capito male il metodo restituisce un array di byte nel quale ogni "casella" contiene il corrispettivo numero del carattere della stringa tradotto in ASCII. Io vorrei poter usare questo array byte[] come chiave per l'inserimento della stringa all'interno della mia HashMap però non so come utilizzarlo!

    Lavorando così però (riporto solo le parti che mi danno problemi, ma se serve posso passare anche tutto il codice sorgente):

    codice:
    HashMap() tabellHash= new HashMap(); 
    byte[] codice; 
    String word; 
    word=scanSq.nextLine(); 
    codice= word.getBytes("ASCII"); 
    tabellHash.put(codice,word);
    ho un problema: quando faccio la put nella tabella, "codice" riferisce ad una specifica zona di memoria e non vengono valutati i suoi dati! quindi due stringhe con gli stessi caratteri risulterebbero comunque con una chiave diversa.
    Come posso risolvere questo problema? Scorrermi tutte le caselle di codice per prenderne i dati aumenterebbe i miei costi computazionali al numero di caratteri presenti (e non solo a quello delle parole come ora invece ottengo)!
    Ci sono metodi che mi permettono di ottenere i dati in maniera efficiente?
    Conoscete funzioni di hash alternative che posso utilizzare o differenti approcci al problema?


    Vi ringrazio, spero di essere stato chiaro! se volete chiarimenti chiedetemi pure. Rispondente anche solamente idee che magari lavorandoci sopra..

  2. #2

    Re: [JAVA] hasmap e getBytes("US-ASCII")

    Ciao, ehm...c'è qualcosa che non mi torna, tu vuoi inserire nella mappa una singola entry per tutte le parole uguali presenti nel file? Se è così come fai poi a contare le occorrenze a partire dalla mappa?
    Mi spiego meglio:

    File:
    riga1: pippo
    riga2: pluto
    riga3: caio
    riga4: gigio
    riga5: pippo
    riga6: pippo
    riga7: pluto

    se tu , come hai detto di voler fare, cerchi di ottenere un codice univoco per parole uguali, e poi usi questo codice per fare

    mappa.put(codice("pippo"),"pippo");
    mappa.put(codice("pippo"),"pippo");
    mappa.put(codice("pippo"),"pippo");

    la mappa memorizzerà sempre un solo valore sovrascrivendo sempre lo stesso...quindi o mi sfugge qualcosa o non hai capito come funzionano le mappe
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3

    Re: [JAVA] hasmap e getBytes("US-ASCII")

    Originariamente inviato da GHoldenBoy
    Devo indicizzare in maniera efficiente dati da file di testo e inserirli in una struttura dati che mi permetta di avere il mionor costo computazionale possibile per inserimento e ricerca. Il file di testo contiene una parola in ogni riga e possono esserci parole uguali nello stesso file; come risultato della ricerca finale devo restituire la somma del numero delle volte che le parole oggetto di ricerca sono presenti nel file.
    In pratica devi contare la frequenza della parola cercata? Da come hai descritto il problema, così sembra. In questo caso, hai scelto la struttura dati giusta.
    Originariamente inviato da GHoldenBoy
    Devo, ora, trovare una funzione che mi permetta di riconoscere univocamente le stringhe che ho ottenuto dal file e che per stringhe uguali mi fornisca lo stesso riusltato
    Puoi definire l'oggetto String come chiave. L'HashMap garantisce che gli oggetti definiti come chiave sono univoci all'interno della struttura e quindi evita che si presentino duplicazioni.
    Originariamente inviato da GHoldenBoy
    codice:
    HashMap() tabellHash= new HashMap();
    Ciò genera sicuramente un errore di compilazione.

  4. #4
    le occorrenze non pensavo di contarle partendo dalla mappa. Ho una classe parola che ha un attributo "volte": l'attributo dovrebbe contenere il numero di volte che la parola è presente nel file.

    Io pensavo di non sovrascrivere: se la chiave è già presente mi limitavo a non inserirla ma ad aumentare il paramentro "volte" della parola.
    Il risultato finale sarà la somma di volte per ogni parola cercata.

    modifica 1: risposta per unomichisiada.. vincenzo hai risposto contemporaneamente ora leggo e rispondo!!

  5. #5
    Originariamente inviato da GHoldenBoy
    le occorrenze non pensavo di contarle partendo dalla mappa. Ho una classe parola che ha un attributo "volte": l'attributo dovrebbe contenere il numero di volte che la parola è presente nel file.

    Io pensavo di non sovrascrivere: se la chiave è già presente mi limitavo a non inserirla ma ad aumentare il paramentro "volte" della parola.
    Il risultato finale sarà la somma di volte per ogni parola cercata.
    Ti basta definire la tua istanza di HashMap in questo modo:
    codice:
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    poi, mentre scorri il file:
    se la get ti restituisce null, fai una put della stringa assegnando il valore 1,
    altrimenti fai una put della stringa incrementando il suo valore.

  6. #6
    Originariamente inviato da GHoldenBoy
    le occorrenze non pensavo di contarle partendo dalla mappa. Ho una classe parola che ha un attributo "volte": l'attributo dovrebbe contenere il numero di volte che la parola è presente nel file.

    Io pensavo di non sovrascrivere: se la chiave è già presente mi limitavo a non inserirla ma ad aumentare il paramentro "volte" della parola.
    Il risultato finale sarà la somma di volte per ogni parola cercata.

    modifica 1: risposta per unomichisiada.. vincenzo hai risposto contemporaneamente ora leggo e rispondo!!
    Ho capito, si mi sembra un buon piano
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    Comunque puoi usare la parola stessa come chiave nella mappa, non hai alcun bisogno di fare anche tu un hash...visto che già la hasmap poi lavora così
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8

    Re: Re: [JAVA] hasmap e getBytes("US-ASCII")

    Originariamente inviato da VincenzoTheBest
    In pratica devi contare la frequenza della parola cercata? Da come hai descritto il problema, così sembra. In questo caso, hai scelto la struttura dati giusta.

    Puoi definire l'oggetto String come chiave. L'HashMap garantisce che gli oggetti definiti come chiave sono univoci all'interno della struttura e quindi evita che si presentino duplicazioni.

    Ciò genera sicuramente un errore di compilazione.
    allora sì, quello che devo fare spiegato con parole molto più semplici e comprensibili (che io non avevo trovato ) è ottenere la frequenza della parola in oggetto di ricerca. Come ho scritto nell'altro messaggio sto lavorando con due classi Parola e Documento.

    per farvi un idea:
    codice:
    public class Parola{
    public String caratteri;
    public int volte;
    public int chiave;
    fino a poco fa la chiave era byte[] sto facendo alcune prove con string.hashCode()

    codice:
    public class Documento2{
    public String indirizzo;
    public HashMap tabellHash;
    public int risultato= 0;
    errori in compilazione non me li sta dando; definendo l'HashMap<byte[],String> invece non riuscivo a compilare!

    Posso definire come key dell'HashMap direttamente la stringa di caratteri della parola??



    ---- modifica 1: grazie mille, ora provo!!

  9. #9

    Re: Re: Re: [JAVA] hasmap e getBytes("US-ASCII")

    Originariamente inviato da GHoldenBoy
    Posso definire come key dell'HashMap direttamente la stringa di caratteri della parola??
    Leggi la mia risposta sopra: http://forum.html.it/forum/showthrea...1#post13250371

  10. #10
    Originariamente inviato da VincenzoTheBest
    Ti basta definire la tua istanza di HashMap in questo modo:
    codice:
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    poi, mentre scorri il file:
    se la get ti restituisce null, fai una put della stringa assegnando il valore 1,
    altrimenti fai una put della stringa incrementando il suo valore.
    allora sto andando avanti così e credo proprio che questa struttura dati sia la migliore, mille grazie!!
    Mi rimane ancora un problema che non riesco a capire, passo il codice:
    recupero parola e carica dell'HashMap
    codice:
    //recupero la parola e elimino \n
    riga=scanSq.nextLine();
    word= riga.substring(0, riga.length()-2);
    //costruttore della classe parola: string caratteri=word , int volte=1
    ParolaF parol= new ParolaF(word);     	     
    if (tabellHash.containsKey(word)) {
         //metodo aggiungVolta() volte++ (riferito alla parola in analisi)
         parol.aggiungVolta();
         //stampa di controllo
         System.out.println("trovata parola "+word+" gia' "+parol.numVolte()+" volte");
         tabellHash.put(word, parol.numVolte());
         //stampa di controllo
         System.out.println("Reinserita parola "+word+" con valore: "+parol.numVolte());
    }
    else {
            i++;
            tabellHash.put(word, parol.numVolte());
            System.out.println("inserita parola numero "+i);
    }
    Metodo cercaParole (dovrebbe ritornare 0 se la parola non è presente altrimenti le volte in cui la parola appare nel documento. Devo passare un array perchè la ricerca deve essere potuta fare anche su array di parole. In questo caso il risultato finale è la somma delle occorrenze di TUTTE le parole ricercate)
    codice:
     
    public int cercaParole(String[] lista){
    	int size= lista.length;
    	for (int i= 0; i < size; i++) {
    		if (tabellHash.get(lista[i]) == null)
    			return risultato;
    		else 
    			risultato= tabellHash.get(lista[i])+risultato;
    			
    	}
    	return risultato;
    	
    }
    a quanto ho capito questo dovrebbe funzionare correttamente ma in un file tipo:
    riga1
    giovani
    caccasauro
    riga1
    riga1

    per una ricerca sopra la parola riga1 mi fornisce come risultato 2 e mi stampa negli output di controllo:
    inserito valore numero 1
    inserito valore numero 2
    inserito valore numero 3
    trovata parola riga1 già 2 volte
    reinserisco riga1 con nuovo valore 2
    trovata parola riga1 già 2 volte
    reinserisco riga1 con nuovo valore 2
    //e come risultato ovviamente ottengo:
    La parola è presente 2 volte

    perchè mi restituisce 2 e non 3? perchè al secondo controllo positivo non aumenta il "volte"??

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.