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()));
}
}