Java 可比列表不工作

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() + ")";
}

}

可以看到,在Operation的equals函数中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;
}

我尝试对变量列表进行排序,但它给我错误消息 "The method sort(List) is undefined for the type Collection",但我已经在变量 class.

中定义了 compareTo 函数

PS。任何人都知道我应该如何在操作 class 中定义 compareTo 函数,我应该先排序参数然后比较每个变量吗?

谢谢。

您使用了错误的 class 进行排序。 Collection.sort 不存在,而 Collections.sort 存在。

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

Collections,作为复数形式,带有 's'.

http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#method.summary

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

由于您依赖于 Operation class 中 arguments 的顺序,请考虑将 Variable 存储在 arguments 中. 这意味着要么使用每个新添加的 VariableList 进行排序,要么使用 Set 而不是 List。因此,您不必在 equalscompareTo 方法中进行排序。

关于 compareTo 方法的问题: 如果 arguments 的大小相同,则遍历两个 arguments 列表,通过 compareTo 和 return 比较 Variables 的相同索引,第一个结果是 != 0。 (如果所有元素都相等,则为“0”)

一个可能的解决方案:

public int compareTo(Operation v) {
  int res = type.compareTo(v.type);
  if (res != 0) return res;

  res = name.compareTo(v.name);
  if (res != 0) return res;

  if (arguments.size() != v.arguments.size()) return arguments.size() - v.arguments.size();

  for (int i = 0; i < arguments.size(); ++i) {
    res = arguments.get(i).compareTo(v.arguments.get(i));
    if (res != 0) return res;
  }

  return 0;
}