我希望一个对象可以比较(在这种情况下在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 ?;
}
}
感谢那些愿意帮助的人, 祝你有愉快的一天!
答案 0 :(得分:20)
你正在过度思考这个问题。 String
有自己的自然顺序,这是字母的,所以你可以像这样使用String.compareTo
:
@Override
public int compareTo(MyObject otherObject) {
return this.name.compareTo(otherObject.name);
}
答案 1 :(得分:4)
return name.compareTo(otherObject.name);
String已经实现了Comparable
,所以你不需要做任何事情。
答案 2 :(得分:1)
我想你想要这样的东西
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);
}
}
答案 3 :(得分:0)
存在许多首选方法。但是为了保持更好的兼容性,性能并避免运行时异常(例如NullPointerException),请使用
的最佳做法。对于字符串
@Override
public int compareTo(OtherObject o) {
return String.CASE_INSENSITIVE_ORDER.compare(this.name,o.name);
}
对于int,请使用双精度浮点数(以避免装箱和拆箱,这些装箱和装箱会在比较器下使用,以提高性能)
// 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方法的实现中比较字段值时,请避免使用<和>运算符。相反,请使用盒装基元类中的静态比较方法或Comparator接口中的比较器构造方法