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.
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;
}