/*
  Introduction to Programming - A.A. 2005/2006
  Lab Exercises 7A and 7B - Solution
*/

import java.util.StringTokenizer;

public class Experiment {

  private int[] data;
    
  public Experiment(String s) {
    StringTokenizer temp = new StringTokenizer(s);
    data = new int[temp.countTokens()];
    int i = 0;
    while (temp.hasMoreTokens()) {
      String t = temp.nextToken();
      data[i] = Integer.parseInt(t);
      i++;
    }
  }

  /* alternative implementation:
  
  public Experiment(String s) {
    StringTokenizer temp = new StringTokenizer(s);
    data = new int[temp.countTokens()];
    for (int i = 0; i < data.length; i++)
      data[i] = Integer.parseInt(temp.nextToken());
  }
  */

  public int getNumber() {
    return data.length;
  }
  
  public int sum() {
    int su = 0;
    for (int i = 0; i < data.length; i++)
      su = su + data[i];
    return su;
  }
  
  public double average(){
    return ((double)sum()) / getNumber();
  }
  
  public int minimum(){
    int min = data[0];
    for (int i = 1; i < data.length; i++)
      if (data[i] < min) min = data[i];
    return min;
  }
  
  public int maximum(){
    int max = data[0];
    for (int i = 1; i < data.length; i++)
      if (data[i] > max) max = data[i];
    return max;
  }
  
  public boolean equalTo(Experiment e) {
    if (data.length != e.data.length) return false;
    for (int i = 0; i < data.length; i++)
      if (data[i] != e.data[i]) return false;
    return true;
  }

  /* alternative implementation that does not use intermediate return statements
  
  public boolean equals(Experiment e) {
    boolean res;
    if (data.length != e.data.length)
      res = false;
    else {
      res = true;
      for (int i = 0; i < data.length; i++)
        res = res && data[i] == e.data[i];
    }
    return res;
  }
  */
    
  public boolean similar(Experiment e) {
    for (int i = 0; i < data.length; i++)
      if (!pcontains(data[i], e.data)) return false;
    for (int i = 0; i < e.data.length; i++)
      if (!pcontains(e.data[i], data)) return false;
    return true;
  }

  private static boolean pcontains(int d, int[] a) {
    for (int i = 0; i < a.length; i++)
      if (d == a[i]) return true;
    return false;
  }

  /* alternative implementation with nested loops:
  
  public boolean similar(Experiment e) {
    boolean res = true;
    for (int i = 0; i < data.length; i++) {
      boolean present = false;
      for (int j = 0; j < e.data.length; j++)
        present = present || data[i] == e.data[j];
        res = res && present;
    }
    for (int i = 0; i < e.data.length; i++) {
      boolean present = false;
      for (int j = 0; j < data.length; j++)
        present = present || e.data[i] == data[j];
        res = res && present;
    }
    return res;
  }
  */
        
  public Experiment merge(Experiment e) {
    int[] res = new int[data.length + e.data.length];
    for(int i = 0; i < data.length; i++)
      res[i] = data[i];
    for(int i = 0; i < e.data.length; i++)
      res[data.length+i] = e.data[i];
    return new Experiment(res);
  }

  // private constructor
  private Experiment(int[] a) {
    data = a;
  }
  
  public boolean contains(int d) {
    return pcontains(d, data);
  }
  
  /* alternative implementation:
  
  public boolean contains(int d) {
    for (int i = 0; i < data.length; i++)
      if (d == data[i]) return true;
    return false;
  } 
  */
 
  public int count(int d) {
    int counter = 0;
    for (int i = 0; i < data.length; i++)
      if (data[i] == d) counter++;
    return counter;
  }

  public boolean hasRepeatedValues() {
    for (int i = 0; i < data.length; i++)
      for (int j = i+1; j < data.length; j++)
        if (data[i] == data[j]) return true;
    return false;
  }

  public void plot() {
    double scale = 80.0/maximum();
    for (int i = 0; i < data.length; i++) {
      for (int j = 0; j < Math.round(data[i]*scale); j++)
        System.out.print("*");
      System.out.println();
    }
  }
  
  public String toString() {
    String res = "";
    for (int i = 0; i < data.length; i++)
      res = res + data[i] + " ";
    return res;
  }

}
