// Metodi di utilita' su array.

public class ArrayUtils { 

    // Chiede la dimensione dell'array, assicurandosi che sia un
    // valore positivo e restituisce un array di interi della
    // dimensione letta, chiedendo i valori all'utente.
    public static  int[] fill_int () {
	int n = 0;
	do {
	    System.out.print("Dimensione array (intero positivo): ");
	    n = Input.readInt();
	} while (n<=0);
	int[] array = new int[n];
	for (int i = 0; i < n; i++) {
	    System.out.print("Dammi l'intero in posizione " + i + ": ");
	    array[i] = Input.readInt();
	}
	return array;
    }

    // Chiede la dimensione dell'array, assicurandosi che sia un
    // valore positivo e restituisce un array di stringhe della
    // dimensione letta, chiedendo i valori all'utente.
    public static  String[] fill_String () {
	int n = 0;
	do {
	    System.out.print("Dimensione array (intero positivo): ");
	    n = Input.readInt();
	} while (n<=0);
	String[] array = new String[n];
	for (int i = 0; i < n; i++) {
	    System.out.print("Dammi la stringa in posizione " + i + ": ");
	    array[i] = Input.readLine();
	}
	return array;
    }

    // Stampa tutti gli elementi dell'array di interi
    // passato per argomento
    public static void print (int[] array) {
	System.out.print("[ ");
        for (int i = 0; i < array.length; i++)
	    System.out.print(array[i] + " ");
	System.out.println("]");
    }

    // Stampa tutti gli elementi dell'array di stringhe
    // passato per argomento
    public static void print (String[] array) {
	for (int i = 0; i < array.length; i++) 
	    System.out.println(array[i]);
    }

    // Restituisce il massimo di un array di interi,
    // Integer.MIN_VALUE se e' vuoto
    public static int maxIterative(int[] array) {	
	int max = Integer.MIN_VALUE;
	for (int i = 0; i < array.length; i++) 
	    if (array[i] > max) max = array[i];
	return max;
    }

    // Restituisce il massimo di un array di interi,
    // Integer.MIN_VALUE se e' vuoto
    public static int maxRecursive(int[] array) {
	return maxRecursive(array,0);
    }

    private static int maxRecursive(int[] array, int indice) {	
	if (indice >= array.length) 
	    return Integer.MIN_VALUE;
	else
	    return Math.max(array[indice], maxRecursive(array,indice+1));
    }

    // Ordina in modo crescente gli elementi dell'array di
    // interi passato per parametro 
    public static void sort(int[] array) {
	for (int i = 0; i < array.length - 1; i++)
	    for (int j = i+1; j < array.length; j++)
		if (array[i] > array[j]) {
		    int tmp = array[i];
		    array[i] = array[j];
		    array[j] = tmp;
		}
    }
 
    // Restituisce una copia (clone) dell'array di interi 
    // passato per parametro
    public static int[] clone(int[] array) {
	int[] newArray = new int[array.length];
	for (int i = 0; i < array.length; i++)
	    newArray[i] = array[i];
	return newArray;
    }

}
