/*
Dato un array di N numeri interi tra 0 e 9 si considerino tutte le
coppie composte da due occorrenze consecutive nelle posizioni dell'array .
Quale è la coppia più frequente? E la meno frequente?
Esempio: N=10
Array= ( 1,2,3,5,3,6,2,6,3,4,).
Le coppie sono: (1,2),(2,3),(3,5),(5,3),(3,6),(6,2),(2,6),(6,3),(3,4).
Esse sono tutte egualemnte frequenti.
*/
import javax.swing.JOptionPane;
class ExArray_04 {
public static void main(String[] args) {
int N;
N = Integer.parseInt(JOptionPane.showInputDialog("Numero di elementi dell'Array?"));
int[] Array = new int[N];
int[] Statx = new int[100];
//riempie l'Array di numeri casuali
for (int i=0; i<Array.length; Array[i++] = (int) (Math.random() * 10));
/*
Incrementa gli elementi di Statx che corrispondono alle coppie di elementi consec. di Array.
SPIEGAZIONE:
In pratica gli elementi di Statx rappresentano tutte le possibili combinazioni di coppie
ottenute con numeri da 0 a 9. Per cui gli elementi di Statx si possono considerare:
0 -> 0,0 1 -> 0,1 2 -> 0,2 ...
10 -> 1,0 11 -> 1,1 12 -> 1,2 ...
97 -> 9,7 98 -> 9,8 99 -> 9,9
Per cui, ad esempio se esce 2 volte la coppia (2,7) si andrà ad incrementare per 2 volte
l'elemento 27 di Statx[]. Alla fine basterà guardare il numero più alto e più basso
presenti dentro Statx[] e gli indici corrispondenti a quei numeri, saranno rispettivamente
la coppia più frequente e meno frequente.
(Es: Se il numero più alto, ad esempio 5, è stato trovato nell'indice 8 vuol dire che la
coppia (0,8) è uscita per 5 volte).
*/
for (int i=0; i<Array.length-1; i++)
Statx[(Array[i]*10)+Array[i+1]]++;
//conta max e min frequenza
int max=0,
min=100, //parto dal massimo
itemmax=0, //salva l'indice dove si è trovato il massimo
itemmin=0; // " " " " " " minimo
for (int i=0; i<100; i++) {
if (max<Statx[i]) {max = Statx[i]; itemmax = i;}
//il minimo si considera per almeno 2 occorrenze (infatti 1 occorrenza è la normale frequenza)
if (min>Statx[i] && Statx[i]>1) {min = Statx[i]; itemmin = i;}
}
//Se non c'è stata nessuna coppia minima che si sia ripetuta per almeno 2 volte...
if (min==100) min=1; //assumi come minimo 1
//risultati...
if (max>1)
System.out.println("\nMAX: La coppia (" + itemmax/10 + ", " + itemmax%10 +") si ripete per " + max + "volte. ");
if (min>1)
System.out.println("MIN: La coppia (" + itemmin/10 + ", " + itemmin%10 +") si ripete per " + min + "volte. ");
if (max==1 && min==1)
System.out.println("Tutte le coppie sono egualmente frequenti");
else if (max == min)
System.out.println("Una sola coppia di numeri si ripetuta piu' volte!");
System.out.println("\nEcco le coppie estratte:");
for (int i=0; i<Array.length-1; i++) System.out.print("("+Array[i]+", "+Array[i+1]+")");
System.out.println();
System.exit(0);
}
}