Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 17 su 17
  1. #11
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da processore Visualizza il messaggio
    pero adesso mi sono bloccato nell'uso dell'interfaccia comparator, o meglio ho capito come implementare il metodo compare per gestire l'ordinamento(ritorna 3 interi, <0, 0, >0) pero una volta passato come parametro al metodo insertion sort non riesco proprio a capire come usarlo, cosa devo fare con quei valori ?
    Se hai separato la logica dell'algoritmo dal criterio di comparazione (sfruttando appunto es. Comparator), all'interno dell'algoritmo devi semplicemente invocare il compare di Comparator, insomma, sfruttare il criterio (qualunque esso sia) che viene fornito.

    Se hai guardato lo pseudo-codice nella pagina di Wikipedia che avevo linkato, avrai visto che l'algoritmo fa 2 passi ben precisi:

    value ← A[i]

    e poi dopo

    A[j] > value

    Questa comparazione in sostanza vuol dire che il criterio è dentro l'algoritmo (e presuppone che si possa usare > es. con i numeri).
    Immagina di dover ordinare oggetti di tipo Persona. Il Comparator passato stabilisce un certo criterio, potrebbe essere es. per cognome/nome oppure solo nome. Questo NON lo sai ... lo "sa" il Comparator.

    Ma questo non ti interessa. A te basta passare A[j] e value al Comparator. Se fai (pseudo-codice):

    int r = comparator.compare(A[j], value);

    e r é > 0, allora sei proprio nella stessa condizione di quella espressione sopra.

    Chiaramente dovresti fare tutto in modo corretto e "generico", ovvero sfruttando i generics. Se il metodo che fai è "generico" e dichiara una type variable <T>, allora il metodo può ricevere un List<T> e il comparator dovrà essere Comparator<? super T>.

    Guarda la signature del sort() (quello con un Comparator) di java.util.Collectios. La forma è quella.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #12
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    A "runtime" (cio� dopo che la applicazione � gi� stata avviata) no. Solo nel momento in cui avvii la JVM.

    java -Xmx800m .....blabla......

    (per 800 MByte di heap massimo)

    Vedi documentazione comando java

    Ok, grazie. Ho cotrollato dovrebbe essere cosi':
    -Xmx --> Dimensione Massima Heap
    -Xms --> Dimensione di partenza Heap
    Posso anche specificare l'unita' di misura:
    k --> KB
    m --> MB
    g --> GB

    Ho fatto un paio di prove e subito penso di averla diminuita, perche' mi va in overflow prima
    Cercando in giro l'ide (sto usando netbeans) dovrebbe settare l'heap di default ad 1/3 o 1/4 della ram del PC. Nel mio caso (8GB) dovrebbe quindi essere gia' di 2gb o 2,66Gb...

    Possibile che un file di 700-800mb richieda piu' di 2gb in RAM???
    Ultima modifica di Mrk31; 13-06-2016 a 14:26

  3. #13
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mrk31 Visualizza il messaggio

    Ok, grazie. Ho cotrollato dovrebbe essere cosi':
    -Xmx --> Dimensione Massima Heap
    -Xms --> Dimensione di partenza Heap
    Posso anche specificare l'unita' di misura:
    k --> KB
    m --> MB
    g --> GB
    Sì k/m/g minuscolo o maiuscolo. E g/G da quanto so è disponibile solo da Java 8 (già nella documentazione di Java 7 non è indicato).

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Ho fatto un paio di prove e subito penso di averla diminuita, perche' mi va in overflow prima
    Cercando in giro l'ide (sto usando netbeans) dovrebbe settare l'heap di default ad 1/3 o 1/4 della ram del PC. Nel mio caso (8GB) dovrebbe quindi essere gia' di 2gb o 2,66Gb...
    Non conosco/uso normalmente NetBeans ma chiaramente questa impostazione la devi mettere o sulla configurazione di launch specifica del progetto oppure sul Runtime Environment configurato globalmente nel IDE (almeno per Eclipse le opzioni possibili sono così).

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Possibile che un file di 700-800mb richieda piu' di 2gb in RAM???
    Sì, assolutamente è possibile! Conta quanti oggetti hai, conta quanto occupano gli oggetti (es. devi sapere come è fatto String all'interno) e potrai farti una idea ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #14
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Sì k/m/g minuscolo o maiuscolo. E g/G da quanto so è disponibile solo da Java 8 (già nella documentazione di Java 7 non è indicato).


    Non conosco/uso normalmente NetBeans ma chiaramente questa impostazione la devi mettere o sulla configurazione di launch specifica del progetto oppure sul Runtime Environment configurato globalmente nel IDE (almeno per Eclipse le opzioni possibili sono così).


    Sì, assolutamente è possibile! Conta quanti oggetti hai, conta quanto occupano gli oggetti (es. devi sapere come è fatto String all'interno) e potrai farti una idea ...
    dunque per il momento sono arrivato a 3gb di partenza e 5 max e continua ad andare in overflow (fa i primi 15milioni abbastanza in fretta poi ci mette una vita!!!)...

    Dato che una volta "caricati" in RAM quei dati devo ancora manipolarli devo cercare in qualche modo di "risparmiare" spazio...

    Penso di "sprecarne" parecchio in "travasi" da un tipo di dato all'altro...
    - Leggo la Linea come stringa (dato1,dato2,dato3, ecc)
    - Splitto la linea in un'array di stringhe
    - Passo l'array di stringhe al costruttore del mio oggetto "Row"
    - Il costruttore effettua il Cast al tipo corretto di ogni datoX...
    Anche se immagino che in tutto ciò intervenga il GarbageColletor???

    L'ideale sarebbe avere un oggetto "Lettore" che mi resituisca i tipi giusti, come per jdbc un rs.getInt, rs.getBoolean, ecc...

  5. #15
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Penso di "sprecarne" parecchio in "travasi" da un tipo di dato all'altro...
    - Leggo la Linea come stringa (dato1,dato2,dato3, ecc)
    - Splitto la linea in un'array di stringhe
    - Passo l'array di stringhe al costruttore del mio oggetto "Row"
    - Il costruttore effettua il Cast al tipo corretto di ogni datoX...
    Anche se immagino che in tutto ciò intervenga il GarbageColletor???
    Un oggetto è "eleggibile" per il g.c. solo quando non è più "raggiungibile" (partendo da un insieme di "radici" ben precise). Se invece è raggiungibile, per qualunque motivo e attraverso qualunque catena di "strong" reference, il g.c. non lo tocca assolutamente.

    Ripeto che bisognerebbe vedere bene cosa hai fatto, quali passaggi, ecc...
    E dovresti gestire le cose in modo molto oculato, ovvero innanzitutto utilizzare i tipi di dato più sensati. Ad esempio non usare Integer se puoi usare int.

    E tieni anche presente che da Java 7 la gestione interna delle stringhe è cambiata. Basta che vedi articoli come:
    https://dzone.com/articles/changes-s...bstring-java-7

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    L'ideale sarebbe avere un oggetto "Lettore" che mi resituisca i tipi giusti, come per jdbc un rs.getInt, rs.getBoolean, ecc...
    Ma questo puoi farlo! Semplicemente crea una piccola architettura che si occupa di leggere e parsare il csv. Insomma una piccola API apposita per questo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #16
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    171
    Grazie al tuo aiuto e alla tua pazienza forse c'è l'ho fatta,

    allora ho creato 3 classi che implementano comparator
    una per ogni campo
    poi nel main creo un menù che a secondo del parametro passato da riga di comando usa uno dei 3 compare,
    sotto ho fatto solo l'esempio del compare tra stringhe.
    può andare ? oppure puiò/deve essere implementato meglio ?
    l'ordinamento ora funziona dal piu grande al più piccolo
    codice:
    public class Field1Comparator implements Comparator<Record>{
    	
    	@Override
    	public int compare(Record r1, Record r2){
    		String f1 = r1.getField1();
    		String f2 = r2.getField1();
    		
    		return f1.compareTo(f2);
    	}
    
    
    }
    codice:
    public class InsertionSort {
    
    
    	
    	public <T> void sort (ArrayList<T> l, Comparator<? super T> c){
    		
    		for(int i=1; i< l.size(); i++){
    		
    			T value = l.get(i);
    			
    			int j = i-1;
    			
    			while( j >= 0 && (c.compare( value, l.get(j) ) >0 ) ){
    				
    				l.set(j+1, l.get(j));
    				j--;
    				
    			}
    			
    			l.set(j+1, value);
    			
    			
    			
    		}
    		
    				
    				
    	}
    main:
    codice:
    InsertionSort s = new InsertionSort();
    			
    			s.sort(lista, new Field1Comparator());
    			
    			
    			for(Record item : lista ){
    				System.out.println(item.toString());
    			}

    ti ringrazio ancora della tua pazienza

  7. #17
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da processore Visualizza il messaggio
    l'ordinamento ora funziona dal piu grande al più piccolo
    Sì, perché è nell'algoritmo che hai "girato" il senso:

    while( j >= 0 && (c.compare( value, l.get(j) ) >0 ) ){

    Ma non va bene. Non è l'algoritmo che deve girare il senso .... è il criterio di comparazione (quindi la implementazione del Comparator)!!

    L'algoritmo insomma deve sempre ragionare in senso ascendente. Poi se per il criterio di comparazione un campo con valore 10 viene prima di un valore 5 ... lo dirà con il valore restituito dal compare e l'algoritmo si adatterà .. senza "sapere" nulla di questo senso.

    Quindi:
    - sistema l'algoritmo
    - gira il senso nel comparator



    Quote Originariamente inviata da processore Visualizza il messaggio
    codice:
    InsertionSort s = new InsertionSort();
    			
    s.sort(lista, new Field1Comparator());
    InsertionSort ha dello "stato" (variabili di istanza)? Direi di no. Quindi puoi rendere il tuo sort() "statico" (esattamente come i sort() del framework).
    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.