// Demonstrates reference vs. value semantics and 
// using arrays of counters
import java.util.*;

public class MoreArrays {
	public static void main(String[] args) {
		// primitive types like ints use value semantics
		int a = 6;
		int b = 7;
		swap(a, b); // doesn't modify main's values
		
		System.out.println(a + " " + b);
		
		// object types like arrays use reference semantics
		int[] one = {4, 2, 4, 5, 6};
		int[] two = {2, 5, 7, 3};
		
		reverse(one); // modifies main's value
		System.out.println(Arrays.toString(one));
		
		// using array as counters
		double[] probs = calcProbs(10000000);
		System.out.println(Arrays.toString(probs));
		
		// returning arrays
		System.out.println(Arrays.toString(merge(one, two)));
	}
	
	public static void swap(int a, int b) {
		int temp = a;
		a = b;
		b = temp;
		System.out.println("In the method: " + a + " " + b);
	}
	
	public static void reverse(int[] one) {
		for(int i = 0; i < one.length / 2; i++) {
			int temp = one[i];
			one[i] = one[one.length - 1 - i];
			one[one.length - 1 - i] = temp;
		}
	}
	
	public static double[] calcProbs(int times) {
		int[] freqs = new int[7];
		
		for(int i = 0; i < times; i++) {
			int die = (int)(Math.random() * 6) + 1;
			freqs[die]++;
		}
		
		double[] probs = new double[7];
		for(int i = 0; i < freqs.length; i++) {
			probs[i] = (double)freqs[i] / times;
		}
		return probs;
	}
	
	public static int[] merge(int[] uno, int[] dos) {
		int[] merged = new int[uno.length + dos.length];
		
		for(int i = 0; i < uno.length; i++) {
			merged[i] = uno[i];
		}
		
		for(int i = 0; i < dos.length; i++) {
			merged[i + uno.length] = dos[i];
		}
		
		return merged;
	}
	
	public static int[] merge3(int[] un, int[] deux, int[] trois) {
		return merge(un, merge(deux, trois));
	}

}

