import java.util.Vector;

public class Tuple
{
  int max_dimension;
  Vector values;
  
  Tuple(int max_dimension)
  {
    this.max_dimension = max_dimension;
    
    values = new Vector();
    
    //set the default value for every dimension to 0
    for (int i = 0; i < max_dimension; i++)
    {
      values.add(new Double(0));
    }    
  }
  
  Tuple(Tuple t)
  {
    this.max_dimension = t.max_dimension;    
    values = new Vector(t.values);
  }
  
  public void setValue(float value, int dimension)
  {
    if (dimension >= 0 && dimension < max_dimension)
    {
      values.setElementAt(new Double(value), dimension);      
    }
  }
  
  public float getValue(int dimension)
  {
    Double value;
    if (dimension >= 0 && dimension < max_dimension)
    {
      value = (Double) values.get(dimension);
      return value.floatValue();      
    }
    return 0;
  }
  
  public int getMaxDimension()
  {
    return this.max_dimension;
  }
 
  public float getDistance(Tuple t)
  {
    float d = 0;    
    for(int i = 0; i < max_dimension; i++)
    {
      d += pow(this.getValue(i) - t.getValue(i), 2);
    }    
    d = sqrt(d);    
    return d;
  }
  
  public Tuple multiply(float scalar)
  {
    Tuple t = new Tuple(max_dimension);
    for(int i = 0; i < max_dimension; i++)
    {
      t.setValue(this.getValue(i) * scalar, i);
    }
    return t;
  }
  
  public Tuple add(Tuple t)
  {
    Tuple t_f = new Tuple(max_dimension);
    for(int i = 0; i < max_dimension; i++)
    {
      t_f.setValue(this.getValue(i) + t.getValue(i), i);
    }
    return t_f;
  }
  
  public String pr()
  {
    String s = "(";
    for(int i = 0; i < max_dimension; i++)
    {
      s += getValue(i);
      if (i < max_dimension - 1)
      {
        s += ", ";
      }
    }
    s += ")";
    return s;
  }  
}

