Search code examples
javacomparable

Java comparable not working in List


public class Variable implements Comparable<Variable> {
String name;
String type;

public Variable(String name, String type){
    this.name = name;
    this.type = type;
}

public String getName(){
    return name;
}

public String getType(){
    return type;
}

public boolean equals(Object o){
    if(o != null && (o instanceof Variable)) {
        return ((Variable)o).getName().equals(name) &&
               ((Variable)o).getType().equals(type);
    }
    return false;
}

public int compareTo(Variable v){
    if (type.compareTo(v.type) != 0) return type.compareTo(v.type);
    return name.compareTo(v.name);
}

public String toString(){
    return type+" "+name;
}

}

public class Operation implements Comparable<Operation>{
String name;
String type;
List<Variable> arguments;   

public Operation(String name, String type){
    this.name = name;
    this.type = type;
    arguments = new ArrayList<Variable>();
}

public void addArgument(Variable a){
    arguments.add(a);
}   

public String getName(){
    return name;
}

public String getType(){
    return type;
}

public List<Variable> getArguments(){
    return arguments;
}

public int getArgumentNumber(){
    return arguments.size();
}

public boolean equals(Object o){
    if(o != null && (o instanceof Operation)) {
        List<Variable> oa = ((Operation)o).getArguments();
        Collection.sort(arguments);
        Collection.sort(oa);
        return ((Operation)o).getName().equals(name) &&
               ((Operation)o).getType().equals(type) &&
               ((Operation)o).getArguments().equals(arguments);
    }
    return false;
}

public int compareTo(Operation v){
    if (type.compareTo(v.type) != 0) return type.compareTo(v.type);
    else if(name.compareTo(v.name) != 0) return name.compareTo(v.name);
    else{
        if (arguments.size() < v.getArgumentNumber()) return -1;
        else if(arguments.size() > v.getArgumentNumber()) return 1;
        else 
    }
}

public String toString(){
    String s = "";
    if (arguments.isEmpty()) return type + " " + name + "(" +  ")";
    else {
        for(Variable v:arguments){
            s+= v.type + " ";
        }
    }
    return type + " " + name + "(" + s.trim() + ")";
}

}

As you can see, in the equals function of Operation class

public boolean equals(Object o){
    if(o != null && (o instanceof Operation)) {
        List<Variable> oa = ((Operation)o).getArguments();
        Collection.sort(arguments);
        Collection.sort(oa);
        return ((Operation)o).getName().equals(name) &&
               ((Operation)o).getType().equals(type) &&
               ((Operation)o).getArguments().equals(arguments);
    }
    return false;
}

I try to sort the list of Variable, but it give me error message "The method sort(List) is undefined for the type Collection", but I have already defined compareTo function in Variable class.

PS. anyone have idea that how should i define compareTo function in Operation class, should i sort first arguments and then compareTo each Variable?

Thanks.


Solution

  • You're using the wrong class to sort. Collection.sort does not exist, while Collections.sort does.

    public boolean equals(Object o){
        if(o != null && (o instanceof Operation)) {
            List<Variable> oa = ((Operation)o).getArguments();
            Collections.sort(arguments);
            Collections.sort(oa);
            return ((Operation)o).getName().equals(name) &&
                   ((Operation)o).getType().equals(type) &&
                   ((Operation)o).getArguments().equals(arguments);
        }
        return false;
    }