Inserire in un solo input numeri interi in un ArrayList

di il
10 risposte

Inserire in un solo input numeri interi in un ArrayList

Rieccomi Il prof mi ha chiesto una modifica a questo algoritmo che avevo creato in precedenza:
import java.util.*;

public class VotoStudente {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		
		System.out.println("Quanti studenti devono partecipare all'esame");
		int studenti = input.nextInt();
		int [] voti = new int [studenti];
		
		int max;
		int min;
		int fre;
		double media;
		
		int i;
		
		for(i = 0; i<voti.length; i++) { //ciclo for per inserimento voti in array
			do { 
		System.out.println("Inserisci il "+(i+1)+" voto.");
		voti[i]=input.nextInt();
		
			}while(voti[i]<18 || voti[i]>30); //ciclo do while per controllo valore voto
			
		}
	
		media=0;
		max = voti[0];
		min = voti[0];
		fre = voti[0];
	
		for(i = 0; i<voti.length; i++) {
			
			media=media+voti[i]; //somma di tutti gli elementi dell'array voti
			
			if(max<voti[i]) { //se max è minore di voti[i]
				
				max=voti[i]; //max assumerà il valore di voti[i]
				
			}
			
			if(min>voti[i]) { //se min è maggiore di voti[i]
				
				min=voti[i]; //min assumerà il valore di voti[i]
			
			}
			
		}
			
		int [] oc = new int [studenti]; //creato array per registrare la frequenza di ogni elemento
		
		for(int p = 0; p<voti.length; p++) {
		for(i = 0; i<voti.length; i++) {
			
			if(voti[p]==voti[i]) { //se il voto dell'indice "p" è uguale a quello dell'indice "i"
				
				oc[p] = oc[p]+1; //conteggio frequenza di un singolo elemento dell'array oc
				
		}
		
		}
						
		}
		
		int maxf = oc[0]; //inizializzo una variabile maxf con il valore della prima cella dell'array oc
		for(int j = 1; j<oc.length; j++) {				
			if(oc[j]>oc[j-1]) { //cerco l'occorenza massima;
				
				maxf=j; //maxf gli do il valore dell'indice j
				fre=voti[maxf]; //in fre salvo il voto con più frequenza;
				System.out.println("Più frequente "+fre);
				break;
				
			}else if(oc[j]==oc[j-1]) {
				
				System.out.println("Non ci sono voti più frequenti");
				break;
			}
		}
			
					
		System.out.println("Il massimo è "+max);
		
		System.out.println("Il minimo è "+min);
		
		System.out.println("la media è "+(media/studenti));		
	
	}
	
}	
L'ho convertito in questo modo con ArrayList e Mappa, la modifica era in pratica poter inserire il valore del voto senza chiedere quanti voti volessi inserire, fin qui niente di particolarmente complicato a parte perderci un qualche ora , però oltre a questo mi ha chiesto di inserire i valori dei voti in una sola riga di input, tipo: 18, 20, 21, 26 ecc.... è fattibile come cosa? come faccio ad inserire in un ArrayList una sequenza di questo tipo?
import java.awt.List;
import java.util.*;
import java.util.Map.Entry;

public class VotoStudente1 {
	
public static Integer Occorrenze(ArrayList<Integer> voti) {
		
		Map<Integer, Integer> occorrenze = new HashMap<Integer, Integer>(); 
		
		for (Integer occV : voti) { 
			
	        Integer j = occorrenze.get(occV); 
	        occorrenze.put(occV, (j == null) ? 1 : j + 1); 
	        
		} 
		
	    // Mostra voto con maggior frequenza
		Map.Entry<Integer, Integer> maxOcc = null;
	    for (Map.Entry<Integer, Integer> occ : occorrenze.entrySet()) {
	    	
	        if (maxOcc == null || occ.getValue().compareTo(maxOcc.getValue()) > 0); {
	        	maxOcc = occ;
	    	
	    }
	        
	    }
	    
	    return maxOcc.getKey();
	    
	}
	   

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		
		int max;
		int min;
		double media;
		int i=0;
		boolean stopvoti = true;
		
		ArrayList <Integer> voti = new ArrayList <Integer>();
		
		System.out.println("Inserisci un voto");
		voti.add(input.nextInt());
			
			while (stopvoti) {
					
				int SiNo;
				System.out.println("Vuoi inserire un'altro voto? 1 per SI/ 2 per NO");
				SiNo = input.nextInt();
				
				if (SiNo==1) {
					System.out.println("Inserisci voto");
					voti.add(input.nextInt());
					
				}else if (SiNo==2) {
					stopvoti = false;
					
				}else System.out.println("Scelta non valida");
				
			}			

		media=0;
		max = voti.get(0);
		min = voti.get(0);
	
		for(i = 0; i<voti.size(); i++) {
			
			media=media+voti.get(i); //somma di tutti gli elementi dell'array voti
			
			if(max<voti.get(i)) { //se max è minore di voti[i]
				
				max=voti.get(i); //max assumerà il valore di voti[i]
				
			}
			
			if(min>voti.get(i)) { //se min è maggiore di voti[i]
				
				min=voti.get(i); //min assumerà il valore di voti[i]
			
			}
			
		}	
			
		System.out.println("Il voto più frequente è "+Occorrenze(voti));
		
		System.out.println("Il voto massimo è "+max);
		
		System.out.println("Il voto minimo è "+min);
		
		System.out.println("la media dei voti è "+(media/voti.size()));		
	
}

}
	

10 Risposte

  • Re: Inserire in un solo input numeri interi in un ArrayList

    SalvatoreT3 ha scritto:


    mi ha chiesto di inserire i valori dei voti in una sola riga di input, tipo: 18, 20, 21, 26 ecc.... è fattibile come cosa?
    Se chiedi in input una linea con nextLine() ed ottieni es. "18, 20, 21, 26" la puoi spezzare (ci sono vari modi) ed ottenere i singoli valori.
  • Re: Inserire in un solo input numeri interi in un ArrayList

    Si ho pensato di usare il nextLine e fare una sorta di casting, però poi ogni singolo numero deve entrare in una posizione dell'ArrayList.
  • Re: Inserire in un solo input numeri interi in un ArrayList

    SalvatoreT3 ha scritto:


    Si ho pensato di usare il nextLine e fare una sorta di casting, però poi ogni singolo numero deve entrare in una posizione dell'ArrayList.
    Hai una stringa (da input) es. "18, 20, 21, 26" e la spezzi. Dipende da con cosa la spezzi, puoi ottenere dei String "18" ecc... da convertire in int o direttamente dei int 18 ecc...
    Alternative:
    - split() di String con una apposita regular expression
    - di nuovo un Scanner con un apposito pattern di delimitazione
    - StringTokenizer (mettendo sia "," che " " come delimitatore)
  • Re: Inserire in un solo input numeri interi in un ArrayList

    Grazie, risolto con lo split()

    if (oneLine.contains(",")) {
    			 String[] votoLine = oneLine.split(", ");
    			 int size = votoLine.length;
    			 int [] votiInt = new int [size];
    			  
    			  for(int separaLinea = 0; separaLinea<votoLine.length; separaLinea++) {
    
    				  votiInt[separaLinea] = Integer.parseInt(votoLine[separaLinea]);
    			
    				  voti.add(votiInt[separaLinea]);
    				 
    			  }
    			  
    			} else {
    			
    				throw new IllegalArgumentException("La stringa " + oneLine + " non contiene virgole");
    		
    			}		
  • Re: Inserire in un solo input numeri interi in un ArrayList

    SalvatoreT3 ha scritto:


    			 String[] votoLine = oneLine.split(", ");
    			 int size = votoLine.length;
    			 int [] votiInt = new int [size];
    			  
    			  for(int separaLinea = 0; separaLinea<votoLine.length; separaLinea++) {
    
    				  votiInt[separaLinea] = Integer.parseInt(votoLine[separaLinea]);
    			
    				  voti.add(votiInt[separaLinea]);
    				 
    			  }
    
    Di per sé è corretto. Ma l'array votiInt in realtà NON servirebbe affatto, guarda bene. (e idem size)

    E per lo split, va bene, è corretto. Ma è molto rigido. Se l'utente inserisce 2 spazi, non ne mette nessuno o ne mette uno prima della "," lo spezzamento non funziona a dovere. Quella è in generale una "espressione regolare" e si può complicarla un po' del tipo "\\s*,\\s*" per accettare 0 o più whitespace prima/dopo la virgola.


    EDIT: wow, questo è il mio 5000° messaggio!
  • Re: Inserire in un solo input numeri interi in un ArrayList

    Si al posto di size potevo usare direttamente votoLine.lenght per la dimensione dell'array è giusto per tenere in ordine, ma nello stesso momento è uno spreco di memoria giusto? Per lo split si è rigido, infatti al primo tentativo mi dava un eccezione sul formato, in pratica era lo spazio che era diverso, mi sono adoperato a risolverlo ma ero corto con i tempi, ormai ho inviato il file al prof, domani si commenta insieme a lui

    Grazie ancora.
  • Re: Inserire in un solo input numeri interi in un ArrayList

    SalvatoreT3 ha scritto:


    ma nello stesso momento è uno spreco di memoria giusto?
    Il votiInt di fatto è inutile perché non usato per altro, quindi in effetti è uno "spreco".
  • Re: Inserire in un solo input numeri interi in un ArrayList

    L'ho uso nella lista, dopo la conversione in intero popolo la lista voti con votiInt.
  • Re: Inserire in un solo input numeri interi in un ArrayList

    SalvatoreT3 ha scritto:


    L'ho uso nella lista, dopo la conversione in intero popolo la lista voti con votiInt.
    Un elemento i-esimo di quell'array lo usi solo come variabile di "passaggio" temporaneo dal parseInt al add.
    Una volta fatto il add, l'elemento dell'array non conta e non c'entra più.
    Ma tutto questo array, non serve! Potresti usare una semplice variabile locale dentro il for oppure passare direttamente il risultato del parseInt al add().
    Insomma, lo ripeto, quell'array è inutile.
  • Re: Inserire in un solo input numeri interi in un ArrayList

    Da principiante non ci avevo pensato, si potevo mettere la conversione nel metodo add().
Devi accedere o registrarti per scrivere nel forum
10 risposte