import java.util.ArrayList;
import java.util.List;


public class TablePartition implements Partition {
	private final List<Integer> leader;
	private int classNumber;
	
	public TablePartition(int n) {
		leader  = new ArrayList<Integer>();
		for (int x = 0; x < n; x++){
			leader.add(x);
		}
		classNumber = n;
	}
	public List<Integer> getLeader() {
		return leader;
	}
	public int find(int x) {
		return leader.get(x);
	}

	public int size() {
		return leader.size();
	}
	
	public int classNumber() {
       return classNumber;
	}
	
	public void union(int x, int y) {
		if (x != y ) {
		   for (int i = 0; i < size(); i++) {
			  if (leader.get(i) == x) {
				  leader.set(i,y);
			   }
		   }
		   classNumber--;
		}
	}
	
    @Override
    public String toString(){
    	StringBuilder sb = new StringBuilder();
    	sb.append("Partition of size ");
    	sb.append(classNumber());
    	sb.append("\n");
    	for (int i = 0; i < size(); i++) {
    		sb.append(String.format("%4d",i));
    	}
    	sb.append("\n");
    	for (int x : leader) {
    		sb.append(String.format("%4d",x));
    	}
    	sb.append("\n");
    
    	return sb.toString();  
    }
}
