package compare;

import java.util.*;

//------------------------------------------------------------------------

class NameCompare implements Comparator<SuperHero> {

	public int compare(SuperHero s1, SuperHero s2)
	{
		return s1.name.compareTo(s2.name);
	}
}

//------------------------------------------------------------------------

class HeightCompare implements Comparator<SuperHero> {

	public int compare(SuperHero s1, SuperHero s2)
	{
		return (new Double(s1.height)).compareTo(s2.height);	
	}
}

//------------------------------------------------------------------------

// does *not* need to implement Comparable<SuperHero> to use Comparator

class SuperHero implements Comparable<SuperHero> {
	
	static String[] Names = { "Molasses Man", "Panther Girl", "Incrediboy", "The Tick", "Ferro Lad", "Human Torch", "Stretchy Dude" };
	
	String name;
	double height;  // in meters
	
	SuperHero() 
	{
		name = Names[(int) (Math.random()*Names.length)];
		height = 1.5 + 0.75 * Math.random();  // in meters -- somewhere between Snooki and Yao Ming...
	}
	
	public String toString() 
	{
		return name + " " + String.format("%.2f", height) + " m";
	}
	
	public int compareTo(SuperHero s)
	{
		// height version
		
		return (new Double(height)).compareTo(s.height);	
		
		// name version
		
		//return name.compareTo(s.name);
	}
}

//------------------------------------------------------------------------

public class Compare {

	
	public static void main(String[] args) {
		
		ArrayList<SuperHero> A = new ArrayList<SuperHero>();
		
		for (int i = 0; i < 10; i++)
			A.add(new SuperHero());
		
		NameCompare namecomp = new NameCompare();
		HeightCompare heightcomp = new HeightCompare();

		// behavior depends on specifics of compareTo() in SuperHero
		//Collections.sort(A);
		
		// sort by height
		Collections.sort(A, heightcomp);
		
		// sort by name
		//Collections.sort(A, namecomp);
		
		System.out.println(A);
		
	}
}


