Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Java] Mi aiutate a capire come funziona questo metodo?

    Ciao,
    stò realizzando un progetto universitario insieme a dei colleghi di corso e ci stiamo dividendo il lavoro. Mi è stata passata una classe che implementa un oggetto DAO che contiene questo metodo e non riesco a capire cosa faccia esattamente. Dal momento che devo usarlo vorrei capire bene cosa mi restituisce e vi prego di darmi una mano (è la mia prima vera esperienza con Java che vada oltre i classici esercizietti):

    Il metodo in questione è questo:

    codice:
    public List<HashMap> getRangePoi(float lon, float lat, int range){
    
            List<HashMap> pois =new ArrayList<HashMap>();
            StringBuffer query = new StringBuffer();
            query.append("SELECT poi_id,alt,lat,lon,nome,tipologia,wikiLink, 3956 * 2 * ASIN(SQRT( ");
            query.append("POWER(SIN((:lat - abs(dest.lat)) * pi()/180 / 2), ");
            query.append("2) + COS(:lat * pi()/180 ) * COS(abs(dest.lat) * ");
            query.append("pi()/180) * POWER(SIN((:lon - dest.lon) * ");
            query.append("pi()/180 / 2), 2) )) as distance ");
            query.append("FROM points_of_interest dest ");
            query.append("having distance < :range ");
            query.append("ORDER BY distance limit 10 ");
    
            List<Object[]>res=sessionFactory.getCurrentSession().createSQLQuery(query.toString())
                    .setParameter("lat", lat)
                    .setParameter("lon", lon)
                    .setParameter("range", range)
                    .list();
            pois=createMapPOI(res);
    
            return pois;
    Da quello che vedo inizialmente si crea un array list di oggetti hash map...mmm personalmente non ho mai usato le hash map fino ad ora, da quello che ho capito sono oggetti che contengono tuple <chiave, valore>

    Poi crea uno StringBuffer che da quello che ho capito è semplicemente una stringa variabile nel contenuto e nelle dimensioni...in pratica una stringa dove posso sbatterci dentro quello che mi serve facendola accrescere nel tempo...

    Poi fà una query immensa in SQL nativo usando la queryappen semplicemente per dividere le varie righe...credo proprio che il risultato di questa query venga messo di volta in volta nello string buffer query anche se non capisco dove gli dice di metterlo là ma a senso è così che funziona (se mi illuminate anche su questa cosa)

    Poi la parte dopo è molto più oscura per me e non riesco a capire cosa faccia e di fatto cosa contiene e come è strutturata la List<HashMap> pois che viene ritornata...

    La classe funziona, è un DAO usato da un web service e mi serve per capire poi cosa ritorna il web service per scrivere un client che usa i dati reperiti dal WS...

    Qualcuno di voi sà aiutarmi?

    Grazie
    Andrea

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: [Java] Mi aiutate a capire come funziona questo metodo?

    Partiamo con ordine:
    StringBuffer risponde ad esigenze di ottimizzazione Mi spiego. come saprai le stringhe in java sono immutabili, per cui se hai la stringa "pippo" e la stringa "pluto"
    fare
    codice:
      String result = pippo + pluto;
    equivale a buttare le due stringhe e a crearne una terza con il contenuto pippopluto.
    Ora a livello di spazio occupato durante l'esecuzione, fare continue concatenazione porta a spreco di memoria.
    StringBuffer è un oggetto che ti consente di fare l'append effettivo della stringa (l'oggetto è uno, la stringa viene aggiunta carattere per carattere) senza crearne una nuova per ogni concatenazione.
    Prova, con un progetto dummy, a fare 100 volte una stringa di un certo tipo con concatenazioni dirette e a farla con stringBuffer. Monitora ovviamente memoria e tempi di esecuzione e noti che con StringBuffer migliori.
    Alcuni dicono anche che StringBuilder sia migliore di StringBuffer, puoi testare.

    HashMap corretto, usate sempre interfacce per il tipo quando potete.


    List<Object[]>res=sessionFactory.getCurrentSession().createSQLQ uery(query.toString())
    .setParameter("lat", lat)
    .setParameter("lon", lon)
    .setParameter("range", range)
    .list();

    questa crea il result della query che tu hai passato come parametro (andando a mettere i valori dei parametri usati per la query).
    poi popoli la lista e la restituisci

    cosa faccia createMapPOI mi è oscuro, so solo che prende una lista di object come parametro e restituisce una lista di hashmap correttamente popolata

  3. #3
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    il metodo prepara una query sql

    per il resto bisogna vedere cosa fa la createMapPOI

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.