我希望对象具有可比性(在这种情况下,可以在TreeSet中使用它。
我的对象有一个名称字段,我希望它按字母顺序排序。
[我首先想到我可以使用字符串的unicode值并简单地进行减法,但是例如,AA将在Ab后面…
这是我的开始方式:
public final class MyObject implements Comparable<MyObject> {
private String name;
public MyObject(String name) {
this.name = name;
}
public String name() {
return name;
}
@Override
public int compareTo(MyObject otherObject) {
return WHAT DO I PUT HERE ?;
}
}
感谢那些会帮助您的人,祝你有美好的一天!
您正在思考问题。 String
有其自己的自然顺序,即字母顺序,因此您可以像这样使用String.compareTo
:
@Override
public int compareTo(MyObject otherObject) {
return this.name.compareTo(otherObject.name);
}
return name.compareTo(otherObject.name);
字符串已经实现了Comparable
,因此您无需执行任何操作。
我认为您想要这样的东西
package mine;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MyObject {
private String name;
public MyObject(String name) {
this.name = name;
}
public MyObject() {
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "MyObject [name=" + name + "]";
}
public static void main(String[] args){
List<MyObject> l = new ArrayList<>();
l.add(new MyObject("Ab"));
l.add(new MyObject("AA"));
l.add(new MyObject());
Collections.sort(l, new Comparator<MyObject>(){
@Override
public int compare(MyObject o1, MyObject o2) {
if (o1.name == null && o2.name == null){
return 0;
}else if (o1.name == null){
return -1;
}else if (o2.name == null){
return 1;
}else{
return o1.name.toUpperCase().compareTo(o2.name.toUpperCase());
}
}
});
System.out.println(l);
}
}
存在很多优先选择的方法。但是,为了保持更好的兼容性,性能以及避免运行时异常(例如NullPointerException),请使用最佳实践,即>
对于字符串
@Override public int compareTo(OtherObject o) { return String.CASE_INSENSITIVE_ORDER.compare(this.name,o.name); }
对于int,请使用double浮点数(以避免装箱和拆箱,这是比较器下的性能问题,]
// with functional expression Comparator.compareInt, Comparator.compareDouble, Comparator.compareFloat // or with static compare method /** * Integer */ public int compareTo(Integer anotherInteger) { return compare(this.value, anotherInteger.value); } /** * Double */ public int compareTo(Double anotherDouble) { return Double.compare(value, anotherDouble.value); } /** * Float */ public int compareTo(Float anotherFloat) { return Float.compare(value, anotherFloat.value); } /** * Objects */ public int compareTo(Object other) { return Object.compare(value, other.value); }
[有效的Java项目14:考虑可比的工具]
最后,每当实现具有合理顺序的值类时,都应该让类实现Comparable接口,以便可以轻松地在基于比较的集合中对它的实例进行排序,搜索和使用。在compareTo方法的实现中比较字段值时,请避免使用运算符。相反,请使用带框原始类型中的静态比较方法或“比较器”界面中的比较器构造方法