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
中.
这意味着要么使用每个新添加的 Variable
对 List
进行排序,要么使用 Set
而不是 List
。因此,您不必在 equals
和 compareTo
方法中进行排序。
关于 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;
}
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
中.
这意味着要么使用每个新添加的 Variable
对 List
进行排序,要么使用 Set
而不是 List
。因此,您不必在 equals
和 compareTo
方法中进行排序。
关于 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;
}