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

    ArrayList contenente HashMap

    Ciao a tutti, è la prima volta che posto sul forum, e sono relativamente "istruito" su Java, ma certo facendo programmini per diletto non sono un'asso.
    Ho un codice che non funziona. In sostanza dovrei caricare una ArrayList con una HashMap, in questa sono contenuti i dati relativi agli stili delle birre. Chiamo un metodo per caricare dal file i dati, faccio un ciclo prima di uscire e la AL è caricata giusta, ma poi quando nel prosieguo del codice cerco di estrarre i dati dalla AL, trovo che questa è si piena, ma con i dati relativi all'ultimo inserimento.in allegato metto il codice. So che per gli esperti sembrerà solo che un'accozzaglia di codice a vanvera, ma in genere io prima cerco di fare l'anima del programma e poi lo sistemo. Certo la programmazione ad oggetti non mi è chiarissima, però in genere forse sprecando le potenzialità di Java i codici girano. Portate pazienza....

    Non capisco come allegare il codice perciò lo incollo qui :
    codice:
    import java.awt.EventQueue;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTabbedPane;
    import javax.swing.JTextArea;
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.awt.event.KeyEvent;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Vector;
    import javax.swing.JTextField;
    
    
    public class PGB {
    	
    	static final long serialVersionUID = 1L;
    	
    	private JTabbedPane tabbedPane;
    	private JFrame frame;
    	private JComboBox<String> cbTipoMalti,cbStiliBirre;
    	private JPanel panel1,panel2;
    	private JTextArea txValoreGravitaMalto;
    	private Vector<String> vettoreMalti = new Vector<String>();
    	private Vector<String> gravitaMalti = new Vector<String>();
    	private Vector<String> vettoreStili = new Vector<String>();
    	private HashMap<String,String> valoriStileBirra = new HashMap<>();
    	private ArrayList<HashMap<String,String>> listaStiliBirre = new ArrayList<>();
    	private JLabel lblStile,lblTipoMalti,lblGravitaMalto,lblOgLow,lblOgHigh,lblFgLow,lblFgHigh,lblSrmLow,lblSrmHigh,lblIbuLow,lblIbuHigh;
    	/**
    	 * Create the application.
    	 */
    	public PGB() {
    		initialize();
    		// TODO cbStiliBirra
    	}
    
    	/**
    	 * Initialize the contents of the frame.
    	 */
    	private void initialize() {
    		frame = new JFrame();
    		frame.setBounds(100, 100, 650, 300);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    		creaTab();
    		frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
    	}
    
    	private void creaTab() {
    		// Primo Pannello Gravita totale birra
    		
    		panel1 = new JPanel();
    		panel1.setLayout( null );
    		
    		lblStile = new JLabel("Stile Birra");
    		lblStile.setBounds(12, 12, 70, 15);
    		panel1.add(lblStile);
    		//caricaBirre(vettoreStili,listaStiliBirre,valoriStileBirra);
    		caricaBirre();
    		cbStiliBirre = new JComboBox<String>(vettoreStili);
    		cbStiliBirre.setBounds(94, 12, 281, 24);
    		cbStiliBirre.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				// TODO Auto-generated method stub
    				//JComboBox<?> jcmbType = (JComboBox<?>) e.getSource();
    				int numeroStile =(int)cbStiliBirre.getSelectedIndex();
    				String ogLowStile =(String) listaStiliBirre.get(numeroStile).get("oglow");
    				String ogHighStile =(String) listaStiliBirre.get(numeroStile).get("oghigh");
    				String fgLowStile =(String) listaStiliBirre.get(numeroStile).get("fglow");
    				String fgHighStile =(String) listaStiliBirre.get(numeroStile).get("fghigh");
    				String srmLowStile =(String) listaStiliBirre.get(numeroStile).get("srmlow");
    				String srmHighStile =(String) listaStiliBirre.get(numeroStile).get("srmhigh");
    				String ibuLowStile =(String) listaStiliBirre.get(numeroStile).get("ibulow");
    				String ibuHighStile =(String) listaStiliBirre.get(numeroStile).get("ibuhigh");
    		        lblOgLow.setText("OG LOW -> "+ogLowStile);
    		        lblOgHigh.setText("OG HIGH -> "+ogHighStile);
    		        lblFgLow.setText("FG LOW -> "+fgLowStile);
    		        lblFgHigh.setText("FG HIGH -> "+fgHighStile);
    		        lblSrmLow.setText("SRM LOW -> "+srmLowStile);
    		        lblSrmHigh.setText("SRM HIGH -> "+srmHighStile);
    		        lblIbuLow.setText("IBU LOW -> "+ibuLowStile);
    		        lblIbuHigh.setText("IBU HIGH -> "+ibuHighStile);
    			}
    		 });
    		panel1.add(cbStiliBirre);
    		
    		lblOgLow = new JLabel("OG LOW");
    		lblOgLow.setBounds(12, 45, 125, 20);
    		panel1.add(lblOgLow);
    		
    		lblOgHigh = new JLabel("OG HIGH");
    		lblOgHigh.setBounds(12, 70, 130, 20);
    		panel1.add(lblOgHigh);
    		
    		lblFgLow = new JLabel("FG LOW");
    		lblFgLow.setBounds(168, 45, 130, 20);
    		panel1.add(lblFgLow);
    		
    		lblFgHigh = new JLabel("FG HIGH");
    		lblFgHigh.setBounds(168, 70, 130, 20);
    		panel1.add(lblFgHigh);
    		
    		lblSrmLow = new JLabel("SRM LOW");
    		lblSrmLow.setBounds(323, 45, 130, 20);
    		panel1.add(lblSrmLow);
    		
    		lblSrmHigh = new JLabel("SRM HIGH");
    		lblSrmHigh.setBounds(323, 70, 130, 20);
    		panel1.add(lblSrmHigh);
    		
    		lblIbuLow = new JLabel("IBU LOW");
    		lblIbuLow.setBounds(476, 45, 130, 20);
    		panel1.add(lblIbuLow);
    		
    		lblIbuHigh = new JLabel("IBU HIGH");
    		lblIbuHigh.setBounds(476, 70, 130, 20);
    		panel1.add(lblIbuHigh);
    
    		lblTipoMalti = new JLabel("Tipo malto");
    		lblTipoMalti.setBounds( 12, 130, 76, 20 );
    		panel1.add( lblTipoMalti );
    		//caricaMalti(vettoreMalti,gravitaMalti );
    		caricaMalti();
    		cbTipoMalti = new JComboBox<String>(vettoreMalti );
    		cbTipoMalti.setBounds( 96, 130, 279, 20 );
    		cbTipoMalti.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				// TODO Auto-generated method stub
    				//JComboBox<?> jcmbType = (JComboBox<?>) e.getSource();
    		        int gravityNumber =(int)cbTipoMalti.getSelectedIndex();
    		        txValoreGravitaMalto.setText(gravitaMalti.get(gravityNumber));
    			}
    		 });
    		panel1.add(cbTipoMalti);
    
    		lblGravitaMalto = new JLabel("Gravita malto");
    		lblGravitaMalto.setBounds( 380, 130, 119, 20 );
    		panel1.add( lblGravitaMalto );
    		txValoreGravitaMalto = new JTextArea("0");
    		txValoreGravitaMalto.setBounds( 503, 130, 76, 20 );
    		txValoreGravitaMalto.setEditable(false);
    		panel1.add( txValoreGravitaMalto );
    		
    		tabbedPane.addTab("GU", panel1);
    		tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);
    
    		//Secondo Pannello Calcolo IBU
    		panel2 =  new JPanel();
    		tabbedPane.addTab("IBU", panel2);
    		tabbedPane.setMnemonicAt(0, KeyEvent.VK_2);
    	}
    	//private void caricaMalti(Vector<String> vettoreMalti,Vector<String>  gravitaMalti) {
    	private void caricaMalti() {
    		// TODO Auto-generated method stub
    		String fileName ="/home/ricky/workspace1/Progettare_Grandi_Birre/file/" + "malti.txt";
    	    try{
    	    FileReader inputFile = new FileReader(fileName);
    	    BufferedReader bufferReader = new BufferedReader(inputFile);
    		String line = "";
    		String cvsSplitBy = ";";
    	    while ((line = bufferReader.readLine()) != null)   {
    	    	String[] malti = line.split(cvsSplitBy);
    	    	vettoreMalti.addElement(malti[0]);
    	    	gravitaMalti.addElement(malti[2]);
    	    }
    	    bufferReader.close();
    	    }catch(Exception e){
    	        System.out.println("Error while reading file line by line:" + e.getMessage());                      
    	    }
    	}
    	
    	//private static  ArrayList<HashMap<String,String>> caricaBirre(Vector<String> vettoreStili , ArrayList<HashMap<String,String>> listaStiliBirre, HashMap<String,String> valoriStileBirra ) {
    	private void caricaBirre() {
    		// TODO Auto-generated method stub
    		String fileName ="/home/ricky/workspace1/Progettare_Grandi_Birre/file/" + "stili.txt";
    	    try{
    	    FileReader inputFile = new FileReader(fileName);
    	    BufferedReader bufferReader = new BufferedReader(inputFile);
    		String line = "";
    		String cvsSplitBy = ",";
    		ArrayList<String> chiavi = new ArrayList<String>();
    		chiavi.add("classe");
    		chiavi.add("categoria");
    		chiavi.add("subcategoria");
    		chiavi.add("oglow");
    		chiavi.add("oghigh");
    		chiavi.add("fglow");
    		chiavi.add("fghigh");
    		chiavi.add("ibulow");
    		chiavi.add("ibuhigh");
    		chiavi.add("srmlow");
    		chiavi.add("srmhigh");
    		chiavi.add("abvlow");
    		chiavi.add("abvhigh");
    	    while ((line = bufferReader.readLine()) != null)   {
    	    	String[] birre = line.split(cvsSplitBy);
    	    	for (int a=0;a<birre.length;a++){
    	    		valoriStileBirra.put(chiavi.get(a).toString(),birre[a].toString());
    	    		if(chiavi.get(a).contains("subcategoria") ) {
    	    			vettoreStili.addElement(birre[a].toString());
    	    		}
    	    	}
    	    	listaStiliBirre.add(valoriStileBirra);
    	    }
    	    bufferReader.close();
    	    }catch(Exception e){
    	        System.out.println("Error while reading file line by line:" + e.getMessage());                      
    	    }
    	    //return listaStiliBirre;
    	}
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					PGB window = new PGB();
    					window.frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    }
    Ultima modifica di MItaly; 29-01-2014 a 01:07 Motivo: Tag

  2. #2

    Moderazione

    Non capisco come allegare il codice perciò lo incollo qui :
    È corretto incollare il codice nel corpo del post, ma devi incollarlo tra tag [CODE] ... [/CODE], altrimenti perde l'indentazione e non viene attivata l'evidenziazione della sintassi. Ora correggo io, in futuro ricordatelo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Grazie

  4. #4
    Nessuno ha qualche suggerimento?

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    L'errore è in questa parte del codice:

    codice:
    while ((line = bufferReader.readLine()) != null)   {
       String[] birre = line.split(cvsSplitBy);
       for (int a=0;a<birre.length;a++){
          valoriStileBirra.put(chiavi.get(a).toString(),birre[a].toString());
          if(chiavi.get(a).contains("subcategoria") ) {
             vettoreStili.addElement(birre[a].toString());
          }
       }
       listaStiliBirre.add(valoriStileBirra);
    }

    Nell'ArrayList "listaStiliBirre" aggiungi sempre lo stesso identico oggetto (che si chiama "valoriStileBirra").
    Dentro al while, infatti, non ri-crei mai questo oggetto (che è una HashMap dichiarata a livello di classe). Quindi, stai modificando sempre lo stesso oggetto

    codice:
          valoriStileBirra.put(chiavi.get(a).toString(),birre[a].toString());
    e lo re-inserisci nell'ArrayList tante volte quante sono le righe del file che leggi.

    Quello che va fatto è la creazione, per ciascuna riga del file, di un nuovo oggetto HashMap su cui effettui tutte le put e che andrai quindi ad inserire nell'arraylist.


    codice:
    while ((line = bufferReader.readLine()) != null)   {
       String[] birre = line.split(cvsSplitBy);
    
       // Creo una nuova hashmap
       HashMap<String,String> mappa = new HashMap<>();
    
       for (int a=0;a<birre.length;a++){
          mappa.put(chiavi.get(a).toString(),birre[a].toString());
          if(chiavi.get(a).contains("subcategoria") ) {
             vettoreStili.addElement(birre[a].toString());
          }
       }
       listaStiliBirre.add( mappa );
    }

    PS: non ho controllato se questo errore lo hai ripetuto in altre parti del codice... verifica.

    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

  6. #6
    LeleFT
    Grazie 1000..... Avevo avuto quel dubbio che però avevo accantonato in quanto credevo che la HM venisse già messa in memoria con la AL linea per linea.... ma a logica in effetti non è così. ... Stasera sistemo le cose....

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 © 2026 vBulletin Solutions, Inc. All rights reserved.