import java.util.*;

public class StringInt
{
    private String string;
    
    private int number;
    
    
    public StringInt(String string, int number) {
        if (string == null)
            throw new NullPointerException
                ("Null string in StringInt constructor");
        
        this.string = string;
        this.number = number;
    }
    
    
    public String getString() {
        return string;
    }
    
    
    public int getInt() {
        return number;
    }
    
    
    public String toString() {
        return string + " " + number;
    }
    
    
    public String toString(int widthS) {
        String format = "%1$" + widthS + "s %2$d";
        return String.format(format, string, number);
    }
    
    
    public String toString(int widthS, int widthN) {
        String format = "%1$" + widthS + "s %2$"+ widthN +"d";
        return String.format(format, string, number);
    }
    
    
    public String toString(int widthS, int widthN, int widthH) {
        String format =
            "%1$" + widthS + "s %2$"+ widthN +"d %2$" + widthH + "x";
        return String.format(format, string, number);
    }
    
    
    public static final Comparator<StringInt> stringFirst
        = new Comparator<StringInt>()
    {
        
        public int compare(StringInt a, StringInt b) {
            int x = a.string.compareTo(b.string);
            
            if (x != 0)
                return x;
            
            return a.number - b.number;
        }
        
        public boolean equals(Object obj) {
            return obj == this;
        }
    };
    
    
    public static final Comparator<StringInt> numberFirst
        = new Comparator<StringInt>()
    {
        
        public int compare(StringInt a, StringInt b) {
            int x = a.number - b.number;
            
            if (x != 0)
                return x;
            
            return a.string.compareTo(b.string);
        }
        
        public boolean equals(Object obj) {
            return obj == this;
        }
    };
    
    
    public boolean equals(Object object) {
        if (! (object instanceof StringInt))
            return false;
        
        StringInt x = (StringInt) object;
        
        return (x.string.equals(string)) && (x.number == number);
    }
    
    
    public int hashCode() {
        return string.hashCode() + number;
    }
    
}
