Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    171

    [JAVA] insertion sort con dati generici

    salve, devo fare un esercizio e ho le idee un po confuse.

    l'esercizio chiede:
    1) prendere un csv con 3 campi, un campo String e 2 campi int
    2) una volta letto questo csv lo devo ordinare con insertion sort
    3) Devo implementare l'insertion sort in modo che riceva tipi generici

    - quello che avevo pensato di fare io è leggere il file e splittare i campi e inserirli in un arraylist,
    il problema e che non so come fare per inserire i dati e poi passarli al insertion sort.

    quello che sono riuscito a fare e creare un arraylist cosi
    ArrayList<Integer> ary = new ArrayList<Integer>();

    e inserire solo il campo int, per il campo string devo rifare tutto e creare una array list a parte e poi ordinare l'uno o l'altro.

    public static <T extends Comparable<T>> void insertionSort (List<T> data)

    e poi insertion sort riceve i dati generici cosi.

    ci sono modi per leggere il file e usare dati generici meglio di questo ?

    grazie

    spero di essere stato chiaro nella mia richiesta
    Ultima modifica di processore; 08-06-2016 a 16:21

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Java ha un forum dedicato.

    Sposto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    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
    1) prendere un csv con 3 campi, un campo String e 2 campi int

    quello che sono riuscito a fare e creare un arraylist cosi
    ArrayList<Integer> ary = new ArrayList<Integer>();

    e inserire solo il campo int, per il campo string devo rifare tutto
    Si presuppone che i 3 campi formino un "record di informazione". E quindi a livello OOP la cosa ovviamente sensata è di modellare il record con una apposita classe. E quindi l'ordinamento avverrà su una lista di oggetti di questo tipo. Ma a questo punto dovresti anche precisare il criterio di ordinamento, perché altrimenti non è chiaro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    171
    ciao, grazie mille per la tua risposta.
    riporto la traccia cosi da essere piu chiaro.

    implementare l'insertion sort , algoritmo va implementato in modo tale da poter essere utilizzato su un generico tipo T.
    il file csv contiene 20000000 di record, il file
    contiene i seguenti campi:
    ● id: (tipo intero) identificatore univoco del record;
    ● field1: (tipo stringa) contiene parole estratte dalla divina commedia, potete assumere che i valorinon contengano spazi o virgole;● field2: (tipo intero);
    ● field3: (tipo floating point);

    si ordinino i dati contenuti nel file csv inordine non decrescente secondo i valori contenuti nei tre campi "field" ( ripetere l'ordinamento tre volte, una volta per ciascun campo).


    quello che ho bisogno di capire e come strutturare l'implementazione ? conviene creare una classe dove inserisco i dati e poi inserisco un oggetto nell arraylist ?
    non ha seso usare l'arraylist ?

    come mi consiglieresti di procedere.

    grazie ancora

  5. #5
    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
    il file csv contiene 20000000 di record
    Se non hai scritto errato ... 20 milioni di record sono tanti, ma proprio TANTI. Assicurati di avere abbastanza heap space sufficiente per la applicazione Java (ad occhio, almeno 1 GByte di heap, se non di più).

    Quote Originariamente inviata da processore Visualizza il messaggio
    conviene creare una classe dove inserisco i dati
    Sì. Una classe es .... Record. (detto così, senza sapere meglio il senso, significato, del record)

    Quote Originariamente inviata da processore Visualizza il messaggio
    e poi inserisco un oggetto nell arraylist ?


    Quote Originariamente inviata da processore Visualizza il messaggio
    non ha seso usare l'arraylist ?
    Non ho capito il senso del dubbio. Comunque sì, ha senso usare ArrayList.
    Ultima modifica di andbin; 08-06-2016 a 22:57
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    171
    ciao, si sono 20 milioni di record.
    io ho provato a fare cosi e lo ordina metto il codice sotto.

    il problema è che non riesco a farlo con i tipi generici.
    mi potresti dare una mano per capire come funzionano i tipi generici ?

    grazie mille

    codice:
    package sort;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.util.ArrayList;
    
    
    public class mainSort {
    
    
    	public static void main(String[] args) {
    		
    		try{
    			ArrayList<records> lista = new ArrayList<records>();
    												
    			FileReader input = new FileReader("C:/file.csv");
    			BufferedReader f = new BufferedReader(input); 
    			
    			String linea ;
    			int i = 0;
    			
    			while((linea = f.readLine()) != null){
    				
    				int id = Integer.parseInt(linea.split(",")[0]);
    				String field1 = linea.split(",")[1];
    				int field2 = Integer.parseInt(linea.split(",")[2]);
    				float field3 = Float.parseFloat(linea.split(",")[3]);
    				
    				lista.add(new records(id, field1, field2, field3 ));
    				System.out.println(i++);
    			}
    			
    			f.close();
    						
    			insertionSort s = new insertionSort(lista);
    			
    			s.sort();
    			
    			for(records p: s.getInputList()){
    				System.out.println(p.getField2());
    			}
    
    
    		}
    		catch(Exception e){
    			System.out.println("verificato un errore");
    		}
    		
    
    
    	}
    
    
    }
    codice:
    package sort;
    
    
    import java.util.ArrayList;
    
    
    public class insertionSort {
    
    
    	private ArrayList<records> inputList = new ArrayList<records>();
    	
    	public ArrayList <records> getInputList() {
            return inputList;
        }
    	
    	
    	
    	//costruttore
    	//tramite il costruttore passiamo a insertionSort la lista
    	public insertionSort(ArrayList<records> input){
    		
    		this.inputList = input;
    		
    	}
    	
    	
    	
    	public void sort (){
    				
    		records tmp ;
    		
    		for(int i=1; i< inputList.size(); i++){
    			
    			for(int j = i; j>0; j--){
    				
    				int key = inputList.get(j).getField2();
    				
    				if(key < inputList.get(j-1).getField2()){
    					
    					tmp = inputList.get(j);
    					
    					inputList.set(j, inputList.get(j-1));
    					inputList.set(j-1, tmp);
    					
    				}
    				
    			}
    			
    		}
    		
    				
    				
    	}
    	
    	
    	
    }
    codice:
    package sort;
    
    
    public class records {
    	
    	private int id;
    	private String field1;
    	private int field2;
    	private float field3;
    	
    	public records(int id, String field1, int field2, float field3){
    		this.id = id;
    		this.field1 = field1;
    		this.field2 = field2;
    		this.field3 = field3;
    		
    	}
    	
    	public int getId(){
    		return id;
    	}
    	
    	public String getField1(){
    		return field1;
    	}
    	
    	public int getField2(){
    		return field2;
    	}
    	
    	public float getField3(){
    		return field3;
    	}
    	
    	
    
    
    }

  7. #7
    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
    ciao, si sono 20 milioni di record.
    Allora ribadisco che una cosa a cui dovrai sicuramente prestare attenzione è il dimensionamento del heap space, perché altrimenti la applicazione ti andrà in crash molto velocemente.

    Quote Originariamente inviata da processore Visualizza il messaggio
    il problema è che non riesco a farlo con i tipi generici.
    mi potresti dare una mano per capire come funzionano i tipi generici ?
    Prima, se permetti, alcune questioni più fondamentali, ovvero sulle denominazioni. I nomi di classi dovrebbero iniziare con la maiuscola, quindi InsertionSort invece che insertionSort. E poi Record invece che records. Nota che la tua classe del record modella 1 record, non N. Quindi non è granché appropriato chiamarla records.

    Poi il tuo metodo sort() non mi pare che sia un "insertion sort". Gli algoritmi di ordinamento generalmente non li si "inventa" (ce ne sono già anche troppi). Basta cercare informazioni su uno specifico, es. https://it.wikipedia.org/wiki/Insertion_sort
    E seguire il concetto/algoritmo.

    Riguardo il criterio di ordinamento in effetti ci sono diverse strade. Tu hai più criteri di ordinamento, come dicevi prima: "ripetere l'ordinamento tre volte, una volta per ciascun campo".
    Ora: o replichi l'algoritmo più volte, incapsulando il criterio di ordinamento dentro l'algoritmo (come stavi facendo) oppure puoi cercare di generalizzarlo, esattamente come fanno i sort del framework.

    Il framework ha Arrays.sort() e Collections.sort() (non usa insertion sort ma un altro algoritmo). Questi sort implementano SOLO l'algoritmo di ordinamento ma il criterio di comparazione è delegato agli oggetti stessi da ordinare (se implementano Comparable) oppure ad un Comparator esterno.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se non hai scritto errato ... 20 milioni di record sono tanti, ma proprio TANTI. Assicurati di avere abbastanza heap space sufficiente per la applicazione Java (ad occhio, almeno 1 GByte di heap, se non di più).
    Ciao,
    mi inserisco in questa discussione in quanto ho un problema simile,
    dovrei leggere anch'io un file csv di grandi dimensioni ed il programma mi va in eccezione (per overflow: java.lang.OutOfMemoryError: Java heap space) tra le 15 e le 20 milioni di righe lette.

    Immagino di dover settare la dimensione dello heap, potresti dirmi come? E' possibile farlo a runtime?

    In alternativa/aggiunta è possibile ottimizzare la lettura del file?
    Al momento utilizzo BufferReader, splitto la riga csv in un'array di stringhe che passo al costruttore dell'oggetto Row, creato ad hoc che si occupa di effettuare il parsing dei vari valori.
    Esiste un oggetto "più efficiente/parsimonioso" per leggere da file?

    Ti ringrazio in anticipo...
    Ultima modifica di Mrk31; 13-06-2016 a 09:57

  9. #9
    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
    Immagino di dover settare la dimensione dello heap, potresti dirmi come? E' possibile farlo a runtime?
    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

    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    In alternativa/aggiunta è possibile ottimizzare la lettura del file?
    Al momento utilizzo BufferReader, splitto la riga csv in un'array di stringhe che passo al costruttore dell'oggetto Row, creato ad hoc che si occupa di effettuare il parsing dei vari valori.
    Esiste un oggetto "più efficiente/parsimonioso" per leggere da file?
    Bisognerebbe vedere in dettaglio i dati e il tuo codice. Così come l'hai detto, non mi pare male ma ripeto, bisognerebbe vedere i dettagli.
    Diciamo che se ci sono tantissimi dati uguali, es. ci sono 50000 righe dove in un campo c'è scritto "pippo", a runtime terrai referenziati 50000 oggetti String distinti con lo stesso contenuto. Si potrebbe pensare di realizzare un sistema di "pooling" degli oggetti. Che è applicabile in generale per tutti gli oggetti "immutabili" (String, Integer, ecc...).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    171
    ciao andbin, grazie ai tuoi consigli sto andando avanti nell'implementazione, 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 ?

    grazie mille

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.